跳过使用`git fetch --all`将一些分支/标签复制到本地Git

问题描述 投票:0回答:4

我的 Git 中添加了许多遥控器。每个遥控器都是一个开发人员的存储库。每天我

fetch --all
都会看到他们创建的任何可供审查的新分支。

但是,开发人员可以将“私有”分支推送到远程。比如说,所有以下划线前缀命名的分支都尚未准备好审查,而其他分支已准备好审查。

当执行

git fetch --all
时,我的 Git 图(由
/libexec/git-core/git-gui
)将看到所有分支,无论它们是否有下划线前缀。它使图表变得复杂。

我希望

git fetch
忽略那些被下载到本地 Git 的
_XXXX
分支。所以当我查看 Git 图表时,它就像:

  • 显示分支:
    RemoteA/Branch1
    ,
    RemoteB/Branch1
    ,
    RemoteB/Branch2
  • 忽略分支:
    RemoteA/_Branch2
    RemoteB/_Branch3

我该怎么做?

git git-branch git-fetch git-refspec
4个回答
22
投票

Git v2.29.0 更新

通过 Git v2.29 中添加的负引用规范1,您可以在不改变同事习惯的情况下实现您的初衷。

对于每个同事的遥控器,添加一个负引用规范(即以

^
为前缀)以排除以
_
为前缀的分支。这大致改编自
.git/config
的单元测试和负模式的单元测试。请参阅下面代码块中的最后一行“Fred”遥控器。

[remote "fred"]
    url = something.git
    fetch = +refs/heads/*:refs/remotes/fred/*
    fetch = ^refs/heads/_*

您有两个选项可以在命令行上为

fred
设置此选项:

  • git config --add remote.fred.fetch '^refs/heads/_*'
  • git remote set-branches --add fred '^refs/heads/_*'

原答案

通过特殊的“审查”文件夹扩展VonC的出色答案2您可以修改同事遥控器的

.git/config
条目。这是相关文档

曾经的地方

[remote "fred"]
    url = something.git
    fetch = +refs/heads/*:refs/remotes/fred/*

您可以将其更改为

[remote "fred"]
    url = something.git
    fetch = +refs/heads/review/*:refs/remotes/fred/review/*
    fetch = +refs/heads/other_pattern/*:refs/remotes/fred/other_pattern/*
    fetch = +refs/heads/specific_branch:refs/remotes/fred/specific_branch

执行此操作后,您可能必须清理对已获取的引用的引用,但未来的

git fetch --all
git fetch fred
不会更新您指定的模式之外的任何内容。


1 关于负引用规范的文档很少,并且埋藏在较长的段落中,因此最好的查找位置是Git 的历史VonC 对另一个问题的回答,他在那里提取了相关部分放在一起。
2 或者根据需要添加任意数量的特殊或有趣的文件夹和分支。


6
投票

您可以使用命名空间,而不是使用“

_
”命名约定,将分支推送到
origin/review/Branch1
(
git push Branch1:review/Branch1
)
(在该答案中命名为“组”,或在该答案中命名为“分层分支名称(带斜线的分支名称)”)

这样,您只需获取“review”命名空间中的内容即可:

git fetch +refs/heads/review/*:refs/remotes/origin/review/*


唯一的其他选择是脚本,它将:

    列出远程分支(不获取任何内容):
  • git ls-remote origin
  • 对于每个具有正确名称的分支,
  • 仅获取该分支

2
投票
您可以使用别名一步完成。将其添加到您的

~/.gitconfig

 文件中:

[alias] fall = !sh -c 'git fetch --all && git branch -r | sed /HEAD/d | grep /_ | xargs git branch -dr' --
然后就说

git fall

。它将删除所有包含 
/_
 的远程分支。

您可以观察 shell 命令别名的复杂性。


-4
投票
您可以使用

ignore-refs

 选项:

git fetch --ignore-refs branch123
    
© www.soinside.com 2019 - 2024. All rights reserved.