Могут ли теги автоматически перемещаться после git filter-branch и rebase?

редактировать вопрос сводится к "может git rebase быть проинструктирован перебазировать теги тоже?"Но ответ на оригинальный вопрос также поможет.


Спрашивать, как добавить прошлое в репозиторий git? Я следовал этим инструкциям. < edit> Затем я перебазировал, чтобы включить файл, который был только в снимках, см. здесь.< / edit> Поскольку история была переписана (git filter-branch или же git rebase или оба?) все теги все еще находятся на исходной временной шкале *, и я бы как-то хотел переместить их на новый. Я думаю, что я сделал все коммит-сообщения с тегами уникальными, чтобы попытаться написать скрипт, который их использует, но более общий git move-tags <from> <to> было бы лучше.

Итак, есть ли способ обратиться к "коммиту, который представляет собой N коммитов после на новой временной шкале, так что N-й коммит после на старой временной шкале будет помечен"? Любое другое решение, кроме очевидной ручной переназначения, также было бы хорошо.

(пожалуйста, не стесняйтесь исправлять это ужасно длинное предложение на простом английском...)

*) эй, мерзавец решил дед-парадокс!

5 ответов

Решение

Я написал сценарий, который делает это.

$ git-rebase-tags master
Rebasing 107 tags onto 'master'
Can't rebase tag 'staging-deploy-01' because there are no identical commits on 'master'
Pointed tag 'v0.0.11' at commit 81e16f2ca1bc7802547bf19c1dba1a68212eafff
Pointed tag 'v0.0.12' at commit 17051cc28084dd56ae56e96767bceee46217c02d
Pointed tag 'v0.0.13' at commit 5d795076ba4b33f81d327dcf9bff727cef7771a2
[...]

См. http://gist.github.com/908381.

Но еще лучше, используйте --tag-name-filter опция встроена в git-filter-branch(1).

Есть способ сделать git filter-branch автоматически обновлять измененные теги, используя --tag-name-filter вариант, как описано в этом ответе.

Не существует встроенного способа делать то, что вы хотите, используя git. 'git rebase --tags' может быть интересным, но его не существует.

Если сообщения о коммитах идентичны, как вы сказали, вы можете просмотреть каждый тег в refs / tags, сделайте:

'git log -1 --pretty=oneline <tagname>'

Сравните сообщение коммита с полным списком:

'git log --pretty=oneline <newbranches>'

Если вы нашли совпадение (а хеш SHA1 отличается), выполните:

'git tag --force <tagname> <new SHA1>'

Я собрал свою собственную реализацию Python, git rebasetags

В случае, если ребаз является интерактивным, вам будет представлена ​​оболочка bash, в которой вы можете внести изменения. При выходе из этой оболочки теги будут восстановлены.

Из этого поста

По словам Томаса Раста по адресу http://git.661346.n2.nabble.com/Rebase-with-tags-td5582971.html:

Леонид Подольный написал (а):

Возможно ли, по крайней мере, получить набор (старый коммит, новый коммит) пар, чтобы я написал небольшой сценарий, который сделает это для меня?

Хук post-rewrite получает этот список, так что вы можете использовать его, если хотите.

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