代码之家  ›  专栏  ›  技术社区  ›  merlin2011

是否有可能“git fetch”只获取特定的分支,而不在每次调用时指定完整的refspec?

git
  •  0
  • merlin2011  · 技术社区  · 4 月前

    情景1

    假设我在 .git/config :

    [remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
    

    使用此配置:

    1. 跑步 git fetch origin 将取回所有树枝。
    2. 跑步 git fetch origin my_branch 将获取origin的副本 my_branch 并更新跟踪分支 refs/remotes/origin/my_branch .

    情景2

    现在假设我有以下节,它命名了两个显式分支,分别是 my_branch .

    [remote "origin"]
        fetch = +refs/heads/master:refs/remotes/origin/master
        fetch = +refs/heads/all-green:refs/remotes/origin/all-green
    

    使用此配置:

    1. 跑步 git获取来源 只会取 master all-green .
    2. 跑步 git获取来源my_branch 将获取分支,但不更新任何跟踪分支。如果我想更新跟踪分支,我必须明确地说 git fetch origin my_branch:refs/remotes/origin/my_branch .

    提问

    是否可以配置 git 以这样的方式,以下两个陈述是正确的?

    1. git获取来源my_branch 将根据场景1中的refspec更新本地跟踪分支 对于my_branch的所有可能值 .
    2. git获取来源 只获取之前明确获取的分支(例如,它们已经有一个远程跟踪分支),而不是与refspec匹配的所有分支。

    换句话说,我想使用 refspec 当我给出要获取的远程分支名称时,自动确定分支映射,但是 当我只是说 git获取来源 没有分支名称。

    我目前的方法是只编辑我想要跟踪的每个远程分支的git配置(手动或使用脚本),但我问这个问题是为了看看是否有更直接的方法来获得我想要的行为。

    1 回复  |  直到 4 月前
        1
  •  1
  •   jthill    4 月前

    编写一个~更新出厂默认跟踪分支非常容易,即使是我通常不跟踪的分支~方便,有效载荷只是

    awk '$2=="branch" { print "git update-ref refs/remotes/origin/"$3,$1 }' \
            $(git rev-parse --git-dir)/FETCH_HEAD | sh -x
    

    你可以随心所欲地调用它。这可能是你最好的选择,因为 我认为这是 the fetch refspec docs

    与推压时不同 git-push[1] ,没有任何配置可以修改这些规则,也没有什么比 pre-fetch 钩子类似于 pre-receive 钩子。

    表示“否”。这确实有道理,抓取通常已经为自定义工作流编写了脚本,其中一些非常常见的支持已经在工厂提供的便利中提供: git pull 是否有几种真正常见的fetch和自定义后续序列。

    对于另一个选项,您还可以自定义备用遥控器,

    git config remote.onebranch.url $(git config remote.origin.url)
    git config remote.onebranch.fetch +refs/heads/*:refs/remotes/origin/*
    

    之后 git fetch onebranch my_branch 如果需要,将更新源跟踪分支。