Git, переписывание истории главной ветки и связанных тегов - PullRequest
5 голосов
/ 16 июля 2009

У меня только что был первый опыт переписывания истории одного из моих репозиториев (с использованием git-filter-branch). Проблема в том, что в репо было несколько тегов, которые после перезаписи кажутся полностью отключенными от приведенной истории. Я думаю, это связано с тем, что история, связанная с тегами, не была переписана, поэтому они должны указывать на старые коммиты. Итак, что я могу сделать, чтобы «применить» теги к новой истории. Немного искусства ASCII, может быть, легче понять мой вопрос:

Оригинал репо:

+  HEAD
|
|
+  TAG 0.2.0
|
|
+  TAG 0.1.0
|
|
+  Initial commit

Структура репо, сообщенная gitk --all после переписывания истории:

    +  HEAD
    |
    |
    |
    |
    |
    |
    |
    |
    +  Initial commit
+  HEAD
|
|
+  TAG 0.2.0
|
|
+  TAG 0.1.0
|
|
+  Initial commit

Ответы [ 3 ]

5 голосов
/ 16 июля 2009

Выглядит как последний шаг этой процедуры, описанной здесь

$ git log --pretty=oneline origin/releases |
  sed -n -e '/^\([0-9a-f]\{40\}\) Tag\( release\)\? \(.*\)/s--\3|\1|Tag release \3-p'
  > ~/paludis-git-tags

$ while read name msg head ; do
  git tag -m "${msg}" ${name} ${head} ;
  done < paludis-git-tags

Идея состоит в том, чтобы прочитать теги из старых версий репозиториев, чтобы повторно применить их к новой истории.


Примечание: в своем первоначальном использовании git-filter-branch, вы использовали:

-- --all

?

--, который отделяет параметры ветвей фильтра от параметров ревизии, и --all для перезаписи всех ветвей и тегов.

Возможно, он сохранил тег в новой истории (хотя я еще не проверял его)

2 голосов
/ 17 июля 2009

Во-первых, вы должны переписать теги , например. (как сказал VonC ) с помощью опции --all для перезаписи всех ссылок.

Если у вас есть аннотированные теги (тяжелые теги), вы также должны использовать опцию --tag-name-filter, например. как --tag-name-filter cat. Обратите внимание, что вы не можете переписать подписанные теги!

1 голос
/ 15 августа 2017

Если вы хотите выполнить изменение, которое можно сделать с помощью git filter-branch, тогда вы можете использовать --tag-name-filter, как описано выше.

Если вы хотите сделать интерактивный перебазинг, вам нужно что-то еще.

Обе вещи могут быть выполнены с помощью git rebasetags

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

enter image description here

С этот пост

...