В git-filter-branch сказано:
Чтобы установить коммит (который обычно находится на вершине другой истории) в качестве родителя длятекущий начальный коммит, чтобы вставить другую историю позади текущей истории:
git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD
(если родительская строка пуста - что происходит, когда мы имеем дело с начальным коммитом - добавьте graftcommit в качестве родителя).
Это именно то, что я хочу, т.е. установить родителя (для фиксации A
) некоторого корневого коммита (B
).См. здесь для соответствующего вопроса.
Но что именно является graft-id в этой команде?Это новый родитель, то есть 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
- второй запуск для времени, когда Breakpad был в libs/breakpad
. official
: копия master
с зеркала Breakpad .
Затем я искал коммит в official
, который был наиболее близко к корнюв breakpad-in-mainsrc
.У меня не было идеального соответствия, поэтому я использовал самый близкий (написал небольшой скрипт на Python, чтобы понять это).Это помечено сейчас как olx-closest-initial-breakpad
.
А потом я хотел объединить эти три истории вместе.Все прошло хорошо, как описано выше (и с учетом моего собственного ответа ниже).
Результат здесь: OpenLieroX Google Breakpad на GitHub