修剪git分支

时间:2018-01-22 09:59:42

标签: git github version-control pruning

您可以使用以下方法修剪远程仓库中不再存在的仓库中的分支:

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!

有没有办法可以修剪与修剪过的跟踪分支相关联的本地非跟踪分支,或者您是否总是要手动删除这些分支?

2 个答案:

答案 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 -pgit fetch --prune。这将删除所有陈旧的远程分支。 如果您不想一直添加标记,可以输入

[fetch] prune = true

进入〜/ .gitconfig

答案 1 :(得分:1)

git无法修剪删除跟踪分支的本地分支。

删除本地非跟踪分支的常用方法基于以下情况:

情况1:git repo中有一些分支

如果您的本地仓库中有一些分支,您可以手动删除本地非跟踪分支。

您可以使用命令git branch -a将远程跟踪分支与本地分支进行比较,然后手动删除相关分支。

情况2:git repo中有很多分支

如果你的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修剪所有跟踪分支。