【问题标题】:Git: How do I list local branches that are tracking remote branches that no longer exist?Git:如何列出正在跟踪不再存在的远程分支的本地分支?
【发布时间】:2014-07-31 10:17:58
【问题描述】:

如何列出任何出现的本地分支(根据.git/config)来跟踪不再存在的远程分支?在这种情况下,远程分支位于 GitHub 上,但我怀疑它们的位置无关紧要。

例如:

  1. 我有本地分支机构,abcd
  2. a 正在跟踪 origin/ac 正在跟踪 origin/c
  3. bd 不跟踪远程分支。
  4. origin/a 已被合并回 master 并在存储库清理期间被删除;我不再需要保留本地分支a
  5. 如果本地分支a 被检出到工作树,运行git fetchgit pull 会导致错误Your configuration specifies to merge with the ref 'a' from the remote, but no such ref was fetched.

如何生成仅包含 a 和任何其他似乎正在跟踪不再存在的远程分支的本地分支的列表?

我想确定这些,以便我可以删除不再需要的过时本地分支。

该列表不应包含未跟踪远程分支的本地分支 bd,也不应包含跟踪仍然存在的 origin/cc

【问题讨论】:

  • 您需要检查.git/config 文件以了解哪些分支配置了上游,以及它们是哪些。假设一个本地分支有一个同名的上游会让你陷入困境。
  • 我已根据您的更新修改了您的问题,如果修改仍然不符合您的要求,请查看并回滚
  • @STW 您的修订并没有真正传达我的要求。我将再次修改问题。
  • @SteveCrane 很酷,您的编辑看起来不错。我很确定我在下面的修改后的答案就是您所需要的

标签: git


【解决方案1】:
LANG=en git branch --format='%(if:equals=gone)%(upstream:track,nobracket)%(then)%(refname:short)%(end)' | grep '.'

【讨论】:

  • 这绝对是 OPs 问题的答案,应该被接受。
  • 这在git remote prune origin 命令之后运行似乎效果很好,谢谢!我使用xargs 将其输入git branch -D 以删除这些分支。
  • @tom_mai78101 我在git branch-purge 命令中使用它。要使这样的git 命令可用,请在您的路径中创建一个git-branch-puge 可执行文件,如下所示:github.com/astyagun/.files/blob/…
  • @AntonStyagun 您的 github 要点丢失。
  • @tom_mai78101 我已经公开了repo,再试一次
【解决方案2】:

要列出跟踪已删除远程分支的本地分支,您可以使用git remote prune --dry-run

例如(假设您的远程存储库名为origin):

git fetch
git remote prune origin --dry-run

您可以删除 --dry-run 选项以从本地存储库中删除分支

【讨论】:

  • 读到这个,听起来正是我需要的,但在尝试之后,我不确定它是否是。
  • 如果您的问题发生了根本性的变化,但这回答了这个特定的问题,那么您可以随时提出另一个问题 ;)
  • 不,问题是一样的。我昨天没时间澄清,现在就澄清。
  • 读到这个,听起来正是我需要的,但在尝试之后,我不确定它是否是。 git branch --list 结果包括a,然后我跑了git remote prune origin,上面写着* [pruned] origin/a。现在git branch --list结果还包括agit checkout a报告上游没了,建议git branch --unset-upstream。我这样做了,可以在.git/config 中看到它不再跟踪,但本地分支仍然存在,我必须自己删除它。我希望的结果是删除本地分支。这个答案让我成功了。
  • 我认为这个答案不正确。例如,当我运行命令时,我的输出为空,但我有许多符合问题条件的本地分支。
【解决方案3】:
git for-each-ref refs/heads --format='%(refname:short) %(upstream)' \
| awk 'NF==1'

会做的。 NF 是 awk 的“字段数”,它的默认动作是打印。

【讨论】:

    【解决方案4】:

    如果您的本地分支正在跟踪远程分支,您可以过滤分支列表,以便显示没有跟踪分支的分支:

    git branch -vv | grep -v origin
    

    这将提供有关分支上最后一次提交的一些额外信息,但您可以将其过滤掉

    git branch -vv | grep -v origin | awk '{print $1}'
    

    这只会打印未跟踪远程分支的分支的名称。

    【讨论】:

      猜你喜欢
      • 2012-10-15
      • 2010-09-15
      • 2013-04-30
      • 2019-02-16
      • 2014-06-09
      • 2010-09-27
      • 2012-09-18
      • 2017-11-12
      • 1970-01-01
      相关资源
      最近更新 更多