我可以在.git/config中指定获取多个refspecs吗?

use*_*468 32 git

我不想从原点获取每个分支,因为有很多分支.我只想跟踪一些(例如master)和我的分支(在my_name子目录下组织).我可以做以下事情:

$ git fetch origin refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch
Run Code Online (Sandbox Code Playgroud)

我想指定上面的"set"refspecs作为默认值git fetch.我试过了

$ git config remote.origin.fetch refs/heads/my_name/*:refs/remotes/origin/my_name/*
$ git config --add remote.origin.fetch refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

它失败:

$ git config remote.origin.fetch
refs/heads/my_name/*:refs/remotes/origin/my_name/*
error: More than one value for the key remote.origin.fetch: refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

我也尝试以下但它也失败了:

$ git config remote.origin.fetch 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch'
$ git fetch
fatal: Invalid refspec 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch'
Run Code Online (Sandbox Code Playgroud)

注意:Git 1.7.11

Tux*_*ude 34

您可以在中添加以下行.git/config以指定fetch的多个refspec:

[remote "origin"]
       fetch = refs/heads/my_name/*:refs/remotes/origin/my_name/*
       fetch = refs/heads/master:refs/remotes/origin/master
       fetch = refs/heads/some_branch:refs/remotes/origin/some_branch
Run Code Online (Sandbox Code Playgroud)

您可以+在refspec之前添加前缀,如果您想覆盖非快进引用的提取,如下所示:

[remote "origin"]
       fetch = +refs/heads/my_name/*:refs/remotes/origin/my_name/*
       fetch = +refs/heads/master:refs/remotes/origin/master
       fetch = +refs/heads/some_branch:refs/remotes/origin/some_branch
Run Code Online (Sandbox Code Playgroud)

请注意,不支持部分通配(即a/b/ca*不支持,但是a/b/*).

10.5 Git Internals - Refspec

  • @Tuxdude谢谢你.是否有一个命令可以实现上述目标?我试图让我的文档对于新开发人员简洁,我希望他们可以通过"git config remote.origin.fetch"指定多个refspecs,而不是编辑他们的git配置文件. (2认同)

小智 10

要覆盖现有的fetch refspec,无需手动编辑.git/config,您可以根据需要使用--unset-all后续--add数量.

对于问题中所需的refspecs示例,它将是:

    $ git config --unset-all remote.origin.fetch
    $ git config --add remote.origin.fetch +refs/heads/my_name/*:refs/remotes/origin/my_name/*
    $ git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

然后git config --get-all remote.origin.fetch用来验证结果.


Von*_*onC 6

注意:如果您想在一次调用中从不同的 refspec 获取(暂时覆盖配置中注册的 fetch refspec),您可以从 Git 2.1(2014 年 8 月)开始执行此操作。

请参阅Junio C Hamano提交的c5558f8 ( )gitster

自从引入远程跟踪分支的机会更新以来,从f269048左右开始(fetch:机会更新跟踪参考,2013-05-11),并在 v1.8.4 时代进行了一些更新,即使要指定 refspec,配置remote.*.fetch也始终会启动要获取的内容是在命令行上给出的,并且无法在每次调用时禁用或覆盖它

教命令注意--refmap=<lhs>:<rhs>可用于覆盖配置remote.*.fetch为引用映射的命令行选项。

这给了你新的选择:

--refmap=<refspec>
Run Code Online (Sandbox Code Playgroud)

当获取命令行上列出的引用时,使用指定的引用规范(可以多次给出)将引用映射到远程跟踪分支,而不是remote.*.fetch远程存储库的配置变量的值。
有关详细信息,请参阅“配置的远程跟踪分支”部分。

(Git“配置的远程跟踪分支”部分也可以追溯到 Git 2.1:请参阅“很难理解git fetch”)


在 Git 2.25.1(2020 年 2 月)中,“git fetch --refmap=”选项有了更好的文档。

请参阅Derrick Stolee ( )提交的 b40a502(2020 年 1 月 21 日)。(由Junio C Hamano 合并 -- --提交 4b69f29中,2020 年 1 月 30 日)derrickstolee
gitster

fetch:文档和测试 --refmap=""

签署人:Derrick Stolee

为了防止“ ”调用期间出现较长的阻塞时间git fetch,用户可能需要为后台“ ”进程设置时间表git fetch
但是,由于 Git 添加远程时在配置中设置的默认 refspec,这些运行将更新 refs/remotes 分支。
因此,用户不会注意到在前台获取期间远程引用何时更新。事实上,他们可能希望这些引用保持不变,以便他们可以使用上次前台获取调用的引用。

--refmap=这可以通过使用 ' ' 和自定义 refspec覆盖配置的 refspec 来完成:

git fetch --refmap='' <remote> +refs/heads/*:refs/hidden/<remote>/*
Run Code Online (Sandbox Code Playgroud)

填充自定义参考空间并下载新的可访问对象包。
这种调用允许发生一些事情:

  1. 如果参考资料已更新,我们会下载一个新包。2. 由于refs/hidden分支存在,GC不会删除新下载的数据。
  2. 启用后fetch.writeCommitGraph,引用/隐藏引用用于更新提交图文件。

为了避免 refs/hidden 目录无限制地填充,--prune可以包含该选项。当提供这样的引用规范时,该--prune选项不会删除远程引用,而只会删除目标引用空间中的引用。

更新文档以阐明“ --refmap=""”的工作原理并创建测试以保证将来仍然存在此行为。

因此git fetch选项手册页现在包括:

--refmap=<refspec>:
Run Code Online (Sandbox Code Playgroud)

当获取命令行上列出的引用时,使用指定的引用规范(可以多次给出)将引用映射到远程跟踪分支,而不是remote.*.fetch远程存储库的配置变量的值。

<refspec>为选项提供空会--refmap导致 Git 忽略配置的 refspec 并完全依赖作为命令行参数提供的 refspec。有关详细信息,请参阅“配置的远程跟踪分支
” 部分。


请注意,我们在过去 7 年左右的时间里对远程跟踪分支进行的更积极的更新并未反映在文档中,该更新已通过 Git 2.27(2020 年第二季度)进行了纠正。

请参阅Philippe Blain ( )的提交 a440884提交 f6a65de(2020 年 4 月 5 日)。(由Junio C Hamano 合并 -- --在2020 年 4 月 22 日提交 fdee8b1中)phil-blain
gitster

pull doc:纠正示例的过时描述

签字人: Philippe Blain

f269048754(“ fetch:机会性地更新跟踪引用”,2013-05-11,Git v1.8.4-rc0 -批量 #0中列出的合并)以来, git pull中的底层更新了配置的远程跟踪分支。git fetch[](https://git-scm.com/docs/git-pull) <remote> <branch>

然而,文档“示例”部分中的示例git pull仍然表明情况并非如此。

更正该示例的描述。

因此,代替,对于git pull origin next

这会在 FETCH_HEAD 中临时留下一个副本next,但不会更新任何远程跟踪分支。
使用远程跟踪分支,可以通过调用 fetch 和 merge 来完成相同的操作:

您现在拥有

next这会在 FETCH_HEAD 中临时留下一个副本,并更新远程跟踪分支origin/next
可以通过调用 fetch 和 merge 来完成相同的操作: