В git-filter-branch говорится:
Чтобы установить фиксацию (которая обычно находится на кончике другой истории) как родительский элемент текущего начального коммита, чтобы вставить другую историю за текущую историю:
git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
(если родительская строка пуста - это происходит, когда мы имеем дело с первоначальной фиксацией - добавим graftcommit в качестве родителя).
Это именно то, что я хочу, то есть установить родительский (для фиксации A
) некоторый корневой фиксатор (B
). См. здесь для соответствующего вопроса.
Но что такое идентификатор трансплантата в этой команде? Это новый родитель, т.е. A
?
Далее, еще один пример для достижения того же:
или даже проще:
echo "$commit-id $graft-id" >> .git/info/grafts git filter-branch $graft-id..HEAD
Опять же, что такое $graft-id
должно быть в этом примере? И $commit-id
= A
, правильно? Или это $commit-id
= B
и $graft-id
= A
?
Я также читал этот, но я до сих пор не понимаю, зачем мне здесь такая концепция. Почему я не могу просто сделать git filter-branch A..HEAD
или так?
Хорошо, я думаю, что все это понял, см. мой собственный ответ.
Чтобы объяснить, зачем мне это нужно:
В нашем проекте OpenLieroX у нас был включен Google Breakpad в какой-то момент.
Мы не взяли это из официального SVN (потому что в то время это не сработало), но из последней стабильной LastFM (это было просто случайное, что было оттуда - я тоже его использовал мой диск и знал, что люди LastFM, вероятно, взяли стабильную версию Breakpad).
Затем, когда время продолжалось, мы применили несколько патчей к нашей собственной копии Google Breakpad.
Теперь, много месяцев спустя, мы хотим немного почистить истории, получить хороший обзор всех наших патчей на Breakpad и, возможно, также получить их вверх по течению. И самое главное (для нас), мы хотим обновить нашу копию Breakpad.
Итак, я подумал, что лучше всего создать новый репозиторий Git, извлечь из него исходную историю из него и получить в нем весь материал из раздела Breakpad из нашего основного репозитория через git filter-branch
. Я использовал это зеркало Breakpad в качестве базы. filter-branch
также был немного сложнее, потому что мы перемещали весь каталог Breakpad в одной точке внутри репозитория OpenLieroX.
Итак, я закончил с тремя ветвями:
-
breakpad-in-mainsrc
:git filter-branch
- первый запуск за время, когда Breakpad находился вsrc/breakpad/external
. -
breakpad-in-libs
:git filter-branch
-second-run за время, когда Breakpad находился вlibs/breakpad
. -
official
: Копироватьmaster
из Зеркало брейк-панели.
Затем я искал фиксацию в official
, которая была ближе всего к корню в breakpad-in-mainsrc
. У меня не было идеального соответствия, поэтому я использовал самую близкую (написал небольшой Python script, чтобы понять это). Теперь он помечен как olx-closest-initial-breakpad
.
И тогда я хотел объединить эти три истории вместе. Это прошло отлично, как описано выше (и, учитывая мой собственный ответ ниже).
Результат здесь: OpenLieroX Google Breakpad на GitHub