git переопределяет ссылки / заметки при получении?

Я держу свой список изменений в git-notes --ref changelog при разработке. Я всегда делаю заметку о коммите слиянием с мастером и выкладываю его на три пульта (git push <remote> refs/notes/changelog) - но каждый раз, когда я забываю нажать на один пульт и fetch отсюда ссылка переопределяется старой версией:

(Извините за немецкий язык)

$ 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 ответ

Решение

Ты прав. каждый 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

предоставляет три таких refspecs.

Каждый refspec состоит из двух основных частей, разделенных двоеточием: слева - ссылка на источник, а справа - ссылка на назначение. Звездочки * может использоваться и действовать в основном как оболочка * (только в качестве источника; пункт назначения * заменяется любым другим источником * соответствует). Если эта пара имеет префикс со знаком плюс + обновление всегда принудительное (как если бы вы использовали --force в командной строке).

Обратите внимание, что имена для удаленного отслеживания, такие как refs/remotes/github/master существовать в удаленном пространстве: вы получите origin "s master в refs/remotes/origin/master который явно отличается от refs/remotes/github/master, Следовательно, безопасно, по крайней мере для всех обычных целей, извлекать с силой такие имена: вы не можете перезаписать свои собственные ветви, которые находятся в refs/heads/ или имена удаленного отслеживания любого другого пульта.

Это, конечно, не верно для ссылок на заметки в refs/notes/ ни для тегов в refs/tags/ так что будьте осторожны с ведущими + на любой из тех.

Другие вопросы по тегам