修剪 git 个分支

Pruning git branches

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

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!

有没有一种方法可以同时修剪与修剪后的跟踪分支关联的本地非跟踪分支,或者您是否总是必须手动删除这些分支?

这在 git 中是不可能的。

Git的第一个class原则是避免误删除数据。 如果你推送你的本地分支,而其他人(共同维护者)可能会(意外地)删除它,如果你下次 运行 git remote prune cmd(尽管你可能会在短时间内通过 git 的 reflog 恢复您的工作 - 但那是另一回事了)。

本地分支没有自动清理。如果将分支 A 合并到分支 B,您可以观察到类似的行为。分支 A 仍然存在 - 即使在变得过时之后 - 你仍然必须手动删除它(再次 - 故意)。

话虽如此,您可以尝试这样的操作(请不要盲目地将此代码段复制并粘贴到您的命令行中!

git branch --merged | xargs git branch -d 2>/dev/null

这将完全删除所有 merged 分支。 现在了解合并是一个相对术语非常重要。合并意味着本地分支的任何提示,它是 您正在 运行 从 执行此命令的那个分支的子分支。

如果你从你的 master 分支 运行 这个,你可能会得到你想要的 - 所有 obsolete/merged 分支(从 master 分支的角度来看)都将被删除 - 即使是一个分支可能被称为 develop。 但是,如果您 运行 来自不同的分支...那么不要怪我删除了任何以前合并的分支。

PS:可以运行git fetch -pgit fetch --prune。这将删除所有陈旧的远程分支。 如果你不想一直添加标志,你可以把

[fetch] prune = true

进入你的 ~/.gitconfig

git不能对删除跟踪分支的本地分支进行剪枝

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

情况 1:git 仓库中有几个分支

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

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

情况 2:git 仓库中有很多分支

如果你的 git 仓库中有很多分支,或者你不想手动比较和删除本地非跟踪分支,那么你可以自动删除本地非跟踪分支脚本。

下面是使用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]剪掉一个tracking branch,还可以用git fetch -p剪掉所有tracking branch