抓取时git会覆盖refs / notes吗?

时间:2018-04-24 16:15:52

标签: git git-push git-pull git-fetch git-notes

我在开发时将更改日志保留在git-notes --ref changelog。我总是在合并到主提交上做一个注释并将其推送到三个遥控器(git push <remote> refs/notes/changelog) - 但每次我忘记从一个遥控器和fetch推送它,ref被一些旧版本覆盖:

(对不起德国语言)

$ git fetch github -p
Von github.com:<user>/<repo>
 + ca36d98d...1f3b9041 refs/notes/changelog -> refs/notes/changelog  (Aktualisierung erzwungen)

如何预防?它与我的.git/config有什么关系?

(摘自.git/config):

[remote "github"]
    url = git@github.com:<user>/<repo>.git
    fetch = +refs/heads/*:refs/remotes/github/*
    fetch = +refs/pull/*/head:refs/remotes/github/pr/*
    push = +refs/notes/changelog:refs/notes/changelog
    fetch = +refs/notes/changelog:refs/notes/changelog
[notes "rewrite"]
    rebase = true
    amend = true
[notes]
    rewriteRef = refs/notes/changelog

1 个答案:

答案 0 :(得分:1)

你是对的。 fetch文件中的每个.git/config行指定了Git将使用的众多默认提取引用之一,因此:

fetch = +refs/heads/*:refs/remotes/github/*
fetch = +refs/pull/*/head:refs/remotes/github/pr/*
fetch = +refs/notes/changelog:refs/notes/changelog

提供了三个这样的refspec。

每个refspec由两个由冒号分隔的主要部分组成:左边是源引用,右边是目标引用。可以使用星号*,其行为主要类似于shell glob *(仅作为源;目标*将替换为匹配的源*如果此对前缀为加号+,则始终强制更新(就像在命令行中使用--force一样)。

请注意,远程跟踪名称(例如refs/remotes/github/master)存在于每个远程空间中:您将origin的{​​{1}}提取到master,这明显不同于refs/remotes/origin/master。因此,至少在所有普通用途中,为这些名称强制获取是安全的:您不能覆盖refs/remotes/github/master中的自己的分支,也不能覆盖任何其他远程远程跟踪名称。

对于refs/heads/中的注释引用,以及refs/notes/中的代码,当然为true,因此请谨慎使用前导refs/tags/