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 中:您将获取 origin
的 master
到 refs/remotes/origin/master
这与 refs/remotes/github/master
明显不同。因此,至少对于所有普通目的,强制获取此类名称是安全的:您不能覆盖自己的分支,它们位于 refs/heads/
中,也不能覆盖任何其他远程的远程跟踪名称。
这当然 不是 refs/notes/
中的注释引用,也不是 refs/tags/
中的标签,因此请注意前导 +
] 在其中任何一个上。
我在开发时将更新日志保存在 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 中:您将获取 origin
的 master
到 refs/remotes/origin/master
这与 refs/remotes/github/master
明显不同。因此,至少对于所有普通目的,强制获取此类名称是安全的:您不能覆盖自己的分支,它们位于 refs/heads/
中,也不能覆盖任何其他远程的远程跟踪名称。
这当然 不是 refs/notes/
中的注释引用,也不是 refs/tags/
中的标签,因此请注意前导 +
] 在其中任何一个上。