Могут ли теги автоматически перемещаться после 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 получает этот список, так что вы можете использовать его, если хотите.