【问题标题】:Pruning git branches修剪 git 分支
【发布时间】:2018-01-22 09:59:42
【问题描述】:

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

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 branch -d some-remote-branch
  • 你读过这个问题吗?那就是手动删除分支。
  • 啊,错过了最后一部分。 AFAIK 你必须手动删除它们。
  • 上游分支消失的事实并不意味着您自己的分支就应该消失。如果您在其上做出一两次您想要保存的提交怎么办? (Git 不知道你是否这样做,它只是保留它,因为这是安全的默认设置。)

标签: git github version-control pruning


【解决方案1】:

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

而删除本地非跟踪分支的常用方法有以下几种:

情况1:git repo有几个分支

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

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

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

如果你的git repo中有很多分支,或者你不想手动比较和删除本地非trackign分支,那么你可以通过脚本自动删除本地非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

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

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

【讨论】:

    【解决方案2】:

    这在 git 中是不可能的。

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

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

    话虽如此,你可以尝试这样的事情(请不要盲目地复制'n'粘贴这个sn-p到你的命令行中!

    git branch --merged | xargs git branch -d 2&gt;/dev/null

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

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

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

    [fetch] prune = true

    进入你的 ~/.gitconfig

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 2017-07-05
      • 2011-03-23
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多