【问题标题】:git pull, excluding a specific branchgit pull,不包括特定分支
【发布时间】:2021-09-02 14:41:58
【问题描述】:

我需要git pull 远程存储库中的所有分支,但我想排除一个特定的分支。这是我的尝试,基于我在 https://git-scm.com/docs/git-pull 阅读的内容,查看部分,排除分支:

$ git ls-remote | grep Bad-branch
From git@gitlab.mycompany.com:analytics/path/repo.git
181647289762f00110d67199adec2559a5dbbbe6        refs/heads/Bad-branch

$ git pull origin ^refs/heads/Bad-branch
There are no candidates for merging among the refs that you just fetched.
Generally this means that you provided a wildcard refspec which had no
matches on the remote end.

如您所见,这是行不通的。如何指定要排除的分支?

我也参考了这些帖子,但我不想修改配置文件,只是一个临时命令行规范以忽略分支,直到它被删除。

编辑:为了清楚起见,这里是中断的实际 git 调用,因为我在 Windows 上,从分支名称生成的路径名给出的文件名太长:

$ git pull
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), 384 bytes | 16.00 KiB/s, done.
error: cannot lock ref 'refs/remotes/origin/TCCFOUR-19049-Algo-ProductionModuleLowDeltaT.R-distribution.supply.temperature.in.control.exception-displayed-as-YesNo-in-RDR-but-TrueFalse-in-analytic': Unable to create 'C:/Users/IRINZN/work/projects/analytic-r-docker-setup/analytic-r-cc4-algorithms/.git/refs/remotes/origin/TCCFOUR-19049-Algo-ProductionModuleLowDeltaT.R-distribution.supply.temperature.in.control.exception-displayed-as-YesNo-in-RDR-but-TrueFalse-in-analytic.lock': Filename too long

【问题讨论】:

  • 我们说的是多少个分支?
  • @ScottHunter 在这种情况下只有一个分支。问题是有人创建了一个太长的分支名称,对于 Windows 路径来说太长了(但在 Linux/BSD 系统上还可以)。在等待作者删除它的同时,我希望能够同步我的存储库。
  • @matt 好吧,我的正常工作流程是进行拉动,但现在它正在中断。我想我可以修改我的拉取请求以不中断。 git-pull 文档引用了排除 refspecs 的能力。但如果我真的只需要 fetch 而不是 pull,并且可以排除 fetch 调用,我会采取这样的解决方案。
  • 但关键是,使用 fetch 您不需要排除任何内容,因为它对“您的”文件(本地分支中的文件)没有任何影响。所以没问题。我无法理解您认为自己确实有什么实际问题。当然,也许我只是太慢了。
  • 让您的同事创建一个较短的分支名称,然后删除较长的分支名称,然后责备他或她不知道您的问题跟踪器和 git 分支之间的区别。您可以在问题跟踪器中写一篇文章,分支名称应该简洁明了,您不需要在其名称中写下分支的完整理由。您也可以运行git config --system core.longpaths true,它告诉 git 尝试使用更长的文件路径,但该分支名称仍然是假的。

标签: git


【解决方案1】:

您的最终编辑非常重要。

Git 的分支名称和标签名称以及远程跟踪名称等数据库实现不佳的事实,再加上 Windows 上的文件名长度限制,是导致问题的原因。它根本与git pull 无关,而是与Git 处理创建和更新远程跟踪名称 (refs/remotes/origin/TCCFOUR-19049-Algo-ProductionModul...) 的方式有关。因此,当可笑的分支名称存在于其他存储库中并导致这些问题时,您暂时想要做的是避免要求您自己的 Git 创建此远程跟踪名称

最简单的方法是使用限制git fetch 操作的refspec1 运行git fetchgit pull

git fetch origin foobranch

例如,如果您想更新refs/remotes/origin/foobranch。完成后,您可以运行:

git merge origin/foobranch

或:

git rebase origin/foobranch

视情况而定。如果您希望在不先检查git fetch 结果的情况下快速执行这两项操作,您可以使用方便的git pull 命令:

git pull origin foobranch

将运行:

git fetch origin foobranch

(仅获取一个命名分支并更新您相应的origin/ 名称)后跟git mergegit rebase,您已将其配置为git pull 的默认第二命令。


1Refspec 是一个技术术语。在这里,它相当粗略地翻译为“分支名称”,但这是一个巨大的过度简化。但这里的细节我们不要打扰,留给其他答案吧。


旁注

我通常更喜欢将它们作为两个单独的命令运行,这都是为了保持理智——否则你会想知道为什么一个是 foobranch 而一个是 origin/foobranch——以及运行 other Git 命令fetch 和最终命令之间。

如果您仍然想知道为什么一个是 foobranch 而另一个是 origin/foobranchgit fetch 本身就是原因:当您运行 git fetch origin 时,您是在告诉您的 Git 调用其他的在我存储在名称 origin 下的 URL 上 Git。你的 Git 有他们的 Git,它连接到 他们的 Git 存储库,列出 他们的 分支名称。它们有自己的分支名称,因为每个 Git 存储库都有自己的分支名称。您的分支名称不是他们的分支名称。您和他们共享提交,但不共享分支名称

无论如何,一旦他们列出了所有分支名称,你的Git 现在就有机会获取提交,以便你和他们可以共享它们。所以你的 Git 会检查它们分支上的提交,看看你是否已经拥有它们。 (请记住,一个提交可以在 许多 个分支上,因此即使他们有一千个新的 分支,您也可能已经拥有所有 提交 !)然后,您的 Git 首先会获得您需要的任何新提交。然后,在获得所有提交后,您的 Git 会获取它们的每个 branch 名称,并在您自己的存储库中创建或更新相应的 remote-tracking name。你的 Git 通过在每个分支名称前面加上 origin/ 来做到这一点。

当你运行 git fetch origin 时,你是在告诉你的 Git:给我他们所有的提交和分支。 当你运行 git fetch origin foobranch 时,你是在告诉你的 Git:查看他们所有的分支,但只让我更新 foobranch。 因此,这会将您的获取限制为仅更新您的 origin/foobranch 所需的那些提交。

获取完成并退出后,您将使用您的姓名origin/foobranch 而不是他们的姓名foobranch 来引用他们的最新提交。如果您也想致电您的自己的 分支机构之一foobranch,那是您的事:他们不在乎您使用什么名称。 可能确实关心你使用什么名字,并且使用他们使用的相同名字故意。但这不是他们需要关心的事情。这是要做的事情。

【讨论】:

  • 这对我的帮助比我在原始问题范围内所要求的要大得多。我从这个答案中更好地理解了 git 的结构。
【解决方案2】:

您只能使用 git pull origin <branch-name> 更新单个分支

但是,如果您需要了解新的分支,这是行不通的,我不知道有什么方法可以排除它。您需要删除分支。

git pull 是两个命令的组合。 git fetchgit mergegit fetch 转到远程并检查现有远程分支的状态以及是否存在任何新分支。这是你的命令中断的地方,因为 git 试图创建这个新远程分支的本地状态。如果您执行git branch -r,您将看到您本地知道的所有远程分支的列表。

【讨论】:

  • 我不明白的 git 的一部分...如果我在主分支上执行 git pull,为什么它试图拉下另一个分支,而不是仅仅拉下主更新?
  • @mpettis 为解释正在发生的事情的答案添加了更新。希望这会有所帮助
  • 非常有帮助,谢谢。因此,我相信 pull 和 fetch 都应该中断。所以最初的问题仍然是我是否可以排除检查/获取远程分支列表。看起来像这样的列表可以作为命令行选项提供,并且 git-pull 规范讨论了如何排除 refspecs,但我一定是在解释错误的东西......
  • @mpettis 据我所知,不,您不能排除分支,但是根据您的工作流的 cmets,如果您想更新特定分支,您可以在我的回答中使用该命令。您还应该能够获得特定的分支,但您将无法发现新的分支
猜你喜欢
  • 2011-07-27
  • 2015-09-23
  • 2021-02-04
  • 2016-06-12
  • 2013-10-14
  • 2016-03-24
  • 2017-12-26
  • 2012-12-03
相关资源
最近更新 更多