20+个Git脚本技巧,5分钟告别重复操作

阿木 发布于 7 小时前 1 次阅读


其实最烦的不是Git本身。

是那些你闭着眼睛都会敲、却每天都要敲的命令。

就像你每天刷牙——没人觉得刷牙需要动脑子,但特么的为什么要我刷?

## 子模块?我真的会谢

昨天同事问我:你每次加子模块都要搜一遍URL?

我没回答。

# 项目克隆地址
git clone https://gitcode.com/gh_mirrors/gi/git-scripts.git
cd git-scripts
# 将脚本添加到PATH
export PATH=$PATH:$(pwd)

缘由是我不愿去承认,我竟然在背那个仓库地址时大脑一片混乱,怎么也记不住,哪怕它是我亲自负责且开展的项目。

git submodule add git@github.com:... 等下,是https还是ssh

# 基本用法
git-addsub path/to/submodule
# 批量添加多个子模块
git-addsub module1 module2 module3

网络上的教程都声称git,那种系统能够自动进行格式转换。但是,实事求是来讲,在我安装该系统的第一周,不管怎样都根本没敢去使用它——。

我怕它把我仓库搞炸。

之后有一回加夜班一直到凌晨三点,在进行复制粘贴操作时地址弄错了,运行git status后出现了一堆显示为已修改的数据,那时差点就哭出来了。

# 核心代码片段
repo=$(grep "url = " "$dir/.git/config" | 
    sed 's/.*url = //' | 
    sed 's/git@github.com:([^/]*)//git://github.com/1//' )
(cd "$PROJ_DIR" && 
 git submodule add "$repo" "$SUBDIR" && 
 git commit -m "Added submodule $SUBDIR")

然后装了git-submodule-helper。

现在就是后悔。后悔没早当混蛋。

## 分支落后了吗?懒得查

# 基本用法:显示所有有差异的跟踪分支
git-branch-status
# 显示所有分支(包括同步状态的分支)
git-branch-status -a
# 比较两个特定分支
git-branch-status feature-branch origin/develop
# 显示详细时间戳信息
git-branch-status -v

我有个坏习惯。

切分支前从不看upstream状态。凭感觉。

  | collab-branch  | (behind 1) | (ahead 2) | origin/collab-branch  |
  | feature-branch | (even)     | (ahead 2) | origin/feature-branch |
* | master         | (behind 1) | (even)    | origin/master         |

有时切换过去发觉落后了20个提交,执行git pull居然还冲突,而后在这条压根并非自己要修改的分支之上,耗费15分钟去解决他人代码引发的冲突。

这种时候你就想:我他妈在干嘛?

“git - branch - status”被我安装了,然而,说实话,直至如今,那个表格我始终都没有完全理解明白。

我只看颜色。

红色?不切。

绿色?切。

像红绿灯一样。够了。

## 真正救我命的是git-fire

不是那种“哇这工具好酷”的救。

真的着火

上周五,下午四点五十八分的时候,老板站在了我的身后,然后说道:“线上有个hotfix,要马上处理。”。

当时,工作区里有三份代码没改完,正躺在那儿呢,有两个新文件没被追踪到,还有一个实验性重构进行到一半,结果连编译都无法通过。

搁以前我肯定:git stash。

# 基本用法:创建紧急分支
git-fire
# 带自定义提交信息
git-fire "紧急保存:修复生产环境bug前的状态"

但那天我没。

git fire "老板盯着我快他妈救一下"

就这一句。

当时间来到六点整的时候,我依照准确的时间关闭了电脑。hotfix已然在生产环境中运行着,我那一堆杂乱无章的进度放置在了fire-main-xxx分支上面,其安全程度就如同未曾发生过任何事情一样。

就这才堪称是工具,并非是要令你更为强悍,而是在你失误犯错之际,存在有人来给予兜底保障。

# 分支命名规则
new_branch() {
    echo "fire-${1:-$(current_branch)}-$(user_email)-$(current_epoch)"
}
# 核心保存逻辑
git checkout -b "$(new_branch)"
cd "$(git rev-parse --show-toplevel)"
git add -A
git commit -m "$message" --no-verify
for remote in $(git remote); do
    git push --set-upstream "${remote}" "$(current_branch)" || true
done

## 但有个问题

这些脚本,你装完会发现——

不是所有的“效率工具”都能提升效率。

有的脚本太聪明了。

聪明到它替你做的决定,你自己都看不懂。

# 1. 检查所有分支状态
git-branch-status -a
# 2. 找出长期未使用的过时分支
git-stale-branches
# 3. 跟踪新的远程分支
git-track-branch origin/feature/new-feature
# 4. 删除已合并到主分支的本地分支
git-already-merged master | xargs git branch -d

我尝试过agf的自动合并,它咔哒咔哒地帮我把基准分支进行同步,随后自动推送,接着又自动切了回去。

然后我愣在命令行前:

“……你刚才干了啥?”

我不知道。它也没告诉我。

# 1. 查看贡献者排名
git-rank-contributors
# 2. 同步所有远程仓库
git-sync
# 3. 交互式变基,保持提交历史清晰
git-rebase-master
# 4. 创建签名标签,标记版本发布
git-signed-tag v1.0.0 "Release version 1.0.0"

## 所以我现在的原则

只用那些让我感觉自己还是主人的脚本。

Contributor                 Commits    Lines Added    Lines Removed
-------------------------  --------  -------------  ---------------
John Doe                    156        8923           3215
Jane Smith                  124        6542           2890
Bob Johnson                 87         3251           1562

git-submodule-add,仅为我粘贴URL,不为我思索是否要添加此模块。

git分支状态,仅告知我状态,而不为我进行切换。

git - fire,仅当我叫嚷着说出那句“救命”之时才会迅速冲进来,而在平常的时候却安静得就如同那毫无声息的鸡一般。

# 1. 紧急保存当前工作
git-fire "紧急保存:准备修复生产bug"
# 2. 切换到生产分支
git checkout production
# 3. 创建修复分支
git checkout -b hotfix/production-bug
# 4. 修复完成后,回到原开发分支
git checkout feature/original-work
# 5. 恢复之前的工作状态
git-undo # 或 git reset --hard fire-branch-name

其他诸如自动提交,自动生成提交信息,自动推送到远程——。

不了谢谢。

前一回叫AI给我撰写commit讯息,它写成了“Update code to improve functionality and fix bugs”。

废话文学继承人。

# 克隆仓库
git clone https://gitcode.com/gh_mirrors/gi/git-scripts.git
cd git-scripts
# 临时添加到PATH
export PATH=$PATH:$(pwd)
# 永久添加到PATH(bash用户)
echo "export PATH=$PATH:$(pwd)" >> ~/.bashrc
source ~/.bashrc
# 永久添加到PATH(zsh用户)
echo "export PATH=$PATH:$(pwd)" >> ~/.zshrc
source ~/.zshrc

## 最有用的可能不是脚本

允许自己不用学新东西

# 复制示例配置文件
cp git-branch-status-subtree/gbs-config.sh.inc.example ~/.gbs-config.sh.inc
# 编辑配置
vim ~/.gbs-config.sh.inc
# 设置环境变量指向配置文件
export GBS_CFG_FILE=~/.gbs-config.sh.inc

真的。

Git 2.53发布了,Rust重构,性能又提升了。

# 自动fetch的周期(分钟),-1表示禁用自动fetch
CFG_FETCH_PERIOD=30
# 是否使用彩色输出
CFG_USE_ANSI_COLOR=1
# 上次fetch时间记录文件路径
CFG_LAST_FETCH_FILE=~/.git-branch-status-last-fetch

但我还在用两年前装的git-。够用。

新的worktrunk听说很火,能让AI并行干活。

关我什么事。我又不开AI工厂,我只是个写代码的。

# 创建自定义版本
cp git-addsub git-addsub-custom
# 编辑自定义版本
vim git-addsub-custom
# 添加到PATH(放在原脚本之前)
export PATH=~/custom-scripts:$PATH

## 所以你问我5分钟能提升什么?

不是装20个脚本。

是删掉那18个你装了从没用过的。

# 一键更新所有子模块并检查状态
git-pulltree && git-submodule update --init --recursive && git-branch-status
# 保存当前状态并创建新分支
git-save "WIP: 功能X开发中" && git checkout -b feature/new-feature
# 清理过时分支并同步远程
git-stale-branches | grep -v "master" | grep -v "develop" | xargs git branch -d && git-sync

是给git-fire加个alias:

git config --global alias.out fire

# .gitlab-ci.yml 示例
stages:
  - check
  - sync
branch-status-check:
  stage: check
  script:
    - git-branch-status -a
  only:
    - merge_requests
sync-remotes:
  stage: sync
  script:
    - git-sync
  only:
    - master

以后紧急时刻,你只需要敲:

git out

# 在~/.bashrc或~/.zshrc中添加
alias git-status-all='git-branch-status -a'
alias git-save-and-switch='function gss(){ git-save "$1"; git checkout "$2"; }; gss'
alias git-clean-branches='git-already-merged master | xargs git branch -d'

三个字母。

然后跑。

# 为所有脚本添加执行权限
chmod +x git-*
# 或只为特定脚本添加
chmod +x git-addsub git-branch-status git-fire

真正的效率,从来不是做更多。

是关键时刻,知道怎么跑得更体面。

# Ubuntu/Debian 系统
sudo apt-get install ruby sed grep
# macOS 系统
brew install ruby gnu-sed