您可以使用以下方法修剪远程仓库中不再存在的仓库中的分支:
git remote prune [remoteName]
然而,这只会消除跟踪分支,而不是您已设置的任何本地分支,例如:
$ git branch
* master
some-remote-branch
$ git remote prune origin
Pruning origin
URL: https://myserver.com/DefaultCollection/_git/Repo
* [pruned] origin/some-remote-branch
$ git branch
* master
some-remote-branch <-- non-tracking branch still here!
有没有办法可以修剪与修剪过的跟踪分支相关联的本地非跟踪分支,或者您是否总是要手动删除这些分支?
答案 0 :(得分:1)
这在git中是不可能的。
Git的一流原则是避免意外删除数据。
如果你推动你的本地分支机构和其他人(一个共同维护者)可能会删除它(偶然),如果你下次运行git remote prune
cmd,你就会丢失整个工作(尽管你可以恢复你的工作通过git的reflog短时间 - 但这是另一个故事。)
本地分支机构没有自动清理功能。如果将分支A合并到brach B中,您可以观察到类似的行为。分支A仍然存在 - 即使在变得过时之后 - 并且您仍然必须手动删除它(再次 - 故意)。
现在说,你可以试试这样的事情(请不要盲目地复制'你'在你的cmd线上粘贴这个片段!)
git branch --merged | xargs git branch -d 2>/dev/null
这将删除字面上所有合并的分支。 现在理解合并是一个相对术语非常重要。合并意味着本地分支的任何提示,即的子代,该分支是从运行此命令。
如果你从主分支运行它,你可能得到你想要的东西 - 所有过时/合并的分支(从主分支的角度来看)将被删除 - 甚至是一个可能被称为develop
的分支。
但是,如果你从另一个分支运行它...那么不要责怪我删除任何以前合并的分支。
PS:您可以运行git fetch -p
或git fetch --prune
。这将删除所有陈旧的远程分支。
如果您不想一直添加标记,可以输入
[fetch]
prune = true
进入〜/ .gitconfig
答案 1 :(得分:1)
git无法修剪删除跟踪分支的本地分支。
删除本地非跟踪分支的常用方法基于以下情况:
如果您的本地仓库中有一些分支,您可以手动删除本地非跟踪分支。
您可以使用命令git branch -a
将远程跟踪分支与本地分支进行比较,然后手动删除相关分支。
如果你的git仓库中有很多分支,或者你不想手动比较和删除本地非trackign分支,那么你可以通过脚本自动删除本地非跟踪分支。
以下是使用shell脚本自动删除本地非跟踪分支的示例(假设master
分支不会被删除):
#!/bin/sh
git fetch -p
#checkout HEAD to the branch which you will never delete, here as master won't be deleted
git checkout master
for local in $(git for-each-ref --format='%(refname:short)' refs/heads/)
do
{
if [[ $(git branch -r) =~ $local ]]; then
echo "local branch $local has related tracking branch"
else
git branch -D $local
fi
}
done
然后将删除本地非跟踪分支。
BTW:除了git remote prune [remoteName]
修剪跟踪分支外,您还可以使用git fetch -p
修剪所有跟踪分支。