我希望我的本地和远程存储库始终在分支方面保持同步。
在GitHub上进行Pull Request审核后,我会将分支合并并删除(远程)。 如何在本地存储库中获取此信息并让Git也删除我的本地版本分支?
我希望我的本地和远程存储库始终在分支方面保持同步。
在GitHub上进行Pull Request审核后,我会将分支合并并删除(远程)。 如何在本地存储库中获取此信息并让Git也删除我的本地版本分支?
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
注意:如果你不在 master
分支上,这可能会删除该分支。继续阅读以了解更好的方法。
你可以通过使用 grep
来确保不会删除 master
或任何其他分支。在这种情况下,你需要执行以下命令:
git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d
所以,如果我们想要保留master
,develop
和staging
等分支,我们可以执行以下操作:
git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d
因为它有点长,您可能希望在.zshrc
或.bashrc
中添加一个别名。我的别名叫做gbpurge
(表示git分支清理
):
alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'
然后重新载入您的.bashrc
或.zshrc
文件:
. ~/.bashrc
或者
. ~/.zshrc
master
将被删除。 - Rubens Mariuzzogrep -Ev '(\*|master|important-branch)'
。 - Andrew Burns~/.gitconfig
文件中,可以添加以下代码到 [alias]
部分:gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
(在 grep 表达式中不需要使用括号)。 - dskrvk我使用与GitHub相同的流程,但并没有找到之前的答案令我满意,因为git branch --merged
列出了已合并的分支,但在我的情况下,并不是所有这些分支都被远程删除了。所以,这个命令对我有用:
git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
其中:
git fetch --all -p
:更新本地分支状态git branch -vv
:列出本地分支状态grep ": gone]"
:过滤已删除的分支awk '{ print $1 }'
:提取它们的名称xargs -n 1 git branch -d
:将名称传递给删除命令注意:如果您愿意,您可以使用-D而不是-d来强制删除。
例如:
someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services
someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).
someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services
参考资料:
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
很棒的脚本和解释,谢谢你 :) - Miguelgrazawk '$3 $4 ~ /:gone]$/ { print $1 }'
。 - Jakub Bochenskixargs
的权限。对于处于同样情况的其他人,你可以使用 while 循环代替 xargs
进行管道传输,像这样:...awk '{ print $1 }' | while read -r line; do git branch -D $line; done
- murchu27尝试运行以下命令:
git pull --prune
它会删除您的本地分支,如果相应的远程分支被删除。
上面的说法不太正确。
实际上,运行git pull --prune
只会删除远程跟踪分支,如下所示:
remotes/origin/fff remotes/origin/dev remotes/origin/master
然后,您可以运行git branch -r
检查在您的机器上剩下的远程跟踪分支。假设剩下的分支是:
origin/dev origin/master
这意味着分支 origin/fff
已经被删除了。
因此,在运行 git pull --prune
之后,只需运行:
git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
就可以找到所有本地分支:
然后,<上述命令>| xargs git branch -d
可以删除它们。
--prune
标志只会删除远程跟踪分支,而不是本地分支。 - user456814git fetch --prune
命令,这是我首选的方式。 - e_m0neygit pull --prune
导致了 "You asked to pull from the remote '--prune', but did not specify a branch. Because this is not the default configured remote for your current branch, you must specify a branch on the command line." - jww使用接受的解决方案应该起作用,以避免删除master和development分支:
git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
对于使用PowerShell的人来说,这与上面的答案相当:
git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
git branch -D
(使用 -D
删除未合并分支)。git branch -d branch_name_to_delete
如果您目前在该分支中,它将把您推回主分支。此时,请使用 pull 命令进行同步。
git pull
这样对我没有用。您可以在此处查看我的其他答案: https://dev59.com/nmUo5IYBdhLWcg3w7TCT#34969726
但基本上,我现在将以下内容添加到我的~/.gitconfig
文件中:
[alias]
prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d
我只是为了删除合并后的本地分支而这样做:
git branch -d $(git branch --merged)
如果您想删除不存在的跟踪,请执行以下操作:
git pull --prune
diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -
xargs
轻松删除这些本地分支:diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d
git ls-remote
和git show-ref
。 - user456814git symbolic-ref
和git update-ref
。 - user456814