我遵循一个开发过程,即为每个新功能或故事卡创建一个新的本地分支。完成后,我合并到主分支,然后推。
随着时间的推移,由于懒惰或健忘,我最终会得到一个很大的本地分支列表,其中一些(如spike)可能还没有合并。
我知道如何列出我所有的本地分支,我知道如何删除一个分支,但我想知道是否有一个git命令,允许我删除我所有的本地分支?
下面是git分支——merged命令的输出。
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
所有尝试删除grep -v \*列出的分支(根据下面的答案)都会导致错误:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
我用的是:
git 1.7.4.1
ubuntu 10.04
GNU bash, version 4.1.5(1)-release
GNU grep 2.5.4
'git branch -d'子命令可以删除多个分支。所以,简化@sblom的答案,但增加了一个关键的xargs:
git branch -D `git branch --merged | grep -v \* | xargs`
或者,进一步简化为:
git branch --merged | grep -v \* | xargs git branch -D
重要的是,正如@AndrewC所指出的,不鼓励使用git分支来编写脚本。要避免使用,可以使用如下语句:
git for-each-ref --format '%(refname:short)' refs/heads | grep -v "master\|main" | xargs git branch -D
删除时要谨慎!
$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
Story-123-a
Story-123-b
Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).
如果你不需要使用Git本身,你也可以手动或编程地删除. Git /refs/heads下的头。以下应该在Bash下进行最小的调整:
shopt -s extglob
rm -rf .git/refs/heads/!(master)
这将删除除主分支外的所有本地分支。由于上游分支存储在.git/refs/remotes下,因此它们将保持不变。
如果你不使用Bash,或者想一次递归很多Git存储库,你可以用GNU find做类似的事情:
find . \
-path remotes -path logs -prune -o \
-wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf
find解决方案可能更容易移植,但是删除路径和文件名比较棘手,而且可能更容易出错。