【问题标题】:How to list branches which are in remote A but not in remote B with git?如何使用git列出远程A中但不在远程B中的分支?
【发布时间】:2017-10-01 19:06:13
【问题描述】:

例如,如果我有一个用于开发的“主”上游存储库,以及一个用于在完成工作日后备份我的工作的侧存储库 - 现在我想删除侧存储库中不在的分支“主”存储库不再存在,因为它们已合并(或其他)。

如何列出存在于“side”远程但不存在于“main”远程的分支?

【问题讨论】:

  • 出于好奇,为什么要有第二个存储库来备份您的工作?当然,您拥有同一存储库的本地和远程版本这一事实为您提供了足够的备份?
  • 因为我必须使用两个(实际上是四个)遥控器。 Git 是分布式的,而不是集中式的!拥有多个遥控器没有任何成本,如果一个遥控器坏了(光盘故障,无论如何),我可以继续工作而无需做任何事情。
  • 成本是尝试上述问题所涉及的额外工作。如果您的遥控器是托管的,那么它已经备份了。您将拥有本地副本和远程存储库中的副本。

标签: git git-branch git-remote


【解决方案1】:

更新 - 合并了来自 torek 的反馈 更新 2 - 对建议脚本的微小但可能很重要的更改


嗯,git 不会考虑存在于多个 repos 中的分支。您在本地仓库中有分支,并且您在任何给定远程中有分支的快照......并且本地分支可能与远程分支具有相同的名称,但它仍然不是“同一个分支”混帐。

只有跟踪提供了一种错觉,即“同一个分支”位于两个存储库中。 (仅作为惯例,通常将本地分支命名为与远程分支相同。)这也受到限制,因为您不能让一个本地分支跟踪两个远程分支......

说来话长,我不认为仅 git 可以完成您的要求;您可能需要以某种方式对一些 git 输出进行后处理。

你可以通过说得到远程分支的列表

git for-each-ref refs/remotes/<remote-name>

您可以使用 cut 来获取基本分支名称 (cut -d\/ -f 4-)。 (注意尾随-,当/仅当您的分支名称包含/ 时这很重要。)然后排序。然后发送到comm 以查看哪些行出现在两者中,或仅出现在一个中。

【讨论】:

  • 对于脚本,最好使用git for-each-ref,它可以做名称模式:git for-each-ref refs/remotes/A 获取您当前为远程A 保存的所有远程跟踪分支名称,例如.加入适当的--format 指令,并按照您的建议,使用comm 或类似指令来识别唯一和共享的指令。另一种选择是使用git ls-remote 来查询遥控器的名称,尽管当你得到答案时,它可能已经过时了
  • 没有遵循您对 for-each-refbranch --list 的推理。 branch --list also 支持模式(在我的示例中使用);模式的解释方式是否存在差异(对于这个用例是否重要)? ls-remote 是一个有趣的选项;除了推/拉/取之外,我不知道 任何 远程交互命令。如果担心本地 repo 的远程 ref 过时,这是一个有趣的选择
  • git branch 的主要问题是它被 Git 称为 porcelain 命令,即针对用户。由于它是瓷器,如果 Git 维护者认为结果更具可读性或有用性,他们可以随意更改输出格式。例如,它可能会突然开始对其输出进行列排序,例如 Unix/Linux ls。至于其他与遥控器联系的 Git 命令,git remote 也会在各种情况下这样做(虽然它对这种特殊情况没有用处)。
  • 嗯...过去我专门引导人们转向瓷器命令,但出于脚本目的,我确实明白你的意思。 (具体示例似乎不是问题,因为在branch --list 输出中已经有控制列的选项,但一般原则是有效的。)
  • 天哪,--column 从 1.7.11 开始就存在了!我从未在文档中注意到它。 :-) git branch 的另一个痛点是,当 for-each-ref 没有实现 --contains--merged 等等时,这是必需的,是当前分支获得了 * 前缀,以及所有分支名称会因潜在的歧义而缩短(x/y 是本地分支 x/y 还是远程 x 上的远程跟踪分支 y?)。
猜你喜欢
  • 2019-07-18
  • 2011-07-02
  • 1970-01-01
  • 2011-03-29
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多