git 在获取时覆盖 refs/notes?

git overrides refs/notes when fetching?

我在开发时将更新日志保存在 git-notes --ref changelog 中。我总是在 merge-to-master 提交上记下并将其推送到三个遥控器 (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

你是对的。 .git/config 文件中的每个 fetch 行都指定了将使用的许多 default fetch refspecs Git 之一,因此:

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

提供三个这样的参考规范。

每个 refspec 由冒号分隔的两个主要部分组成:左侧是源引用,右侧是目标引用。星号 * 可以使用并且主要像 shell glob * (仅作为源;目标 * 替换为与源 * 匹配的任何内容) . 如果此对以加号为前缀+,则始终强制更新(就好像您在命令行中使用了--force)。

请注意,远程跟踪名称如 refs/remotes/github/master 存在于每个远程 space 中:您将获取 originmasterrefs/remotes/origin/master 这与 refs/remotes/github/master 明显不同。因此,至少对于所有普通目的,强制获取此类名称是安全的:您不能覆盖自己的分支,它们位于 refs/heads/ 中,也不能覆盖任何其他远程的远程跟踪名称。

这当然 不是 refs/notes/ 中的注释引用,也不是 refs/tags/ 中的标签,因此请注意前导 + ] 在其中任何一个上。