1

您可以使用以下命令修剪远程存储库中不再存在的存储库中的跟踪分支:

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!

有没有办法也可以修剪与修剪后的跟踪分支相关的本地非跟踪分支,或者你总是必须手动删除这些?

4

2 回答 2

1

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

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

情况1:git repo中有几个分支

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

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

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

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

下面是使用 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

然后本地非跟踪分支将被自动删除。

顺便说一句: 除了git remote prune [remoteName]修剪跟踪分支外,您还可以使用git fetch -p修剪所有跟踪分支。

于 2018-01-23T07:26:49.110 回答
1

这在 git 中是不可能的。

Git 的第一类原则是避免意外删除数据。如果您推送您的本地分支并且其他人(共同维护者)可能会删除它(意外),如果您git remote prune下次运行 cmd,您将丢失整个工作(尽管您可以通过 git 的 reflog 恢复您的工作)很短的时间 - 但这是另一个故事)。

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

话虽如此,您可以尝试这样的事情(请不要盲目地复制'n'将此代码段粘贴到您的 cmd 行中!

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

这将删除所有合并的分支。现在理解合并是一个相对术语非常重要。合并意味着本地分支的任何尖端,即您正在运行此命令的该分支的子级。

如果你从你的 master 分支运行它,你可能会得到你想要的——所有过时/合并的分支(从 master 分支的角度来看)都将被删除——甚至是一个可能被调用的分支develop。但是,如果您从不同的分支运行它......那么不要责怪我删除了任何以前合并的分支。

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

[fetch] prune = true

进入你的 ~/.gitconfig

于 2018-01-22T17:06:26.283 回答