Git: что такое трансплантат или идентификатор трансплантата? - PullRequest
3 голосов
/ 22 мая 2011

В 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

Ответы [ 2 ]

4 голосов
/ 22 мая 2011

Хорошо, похоже, работает так, как я ожидал. Чтобы ответить на мои собственные вопросы:

  • graft-id на самом деле является ничем иным, как идентификатором коммита, то есть SHA1 коммита.
  • $commit-id = B (хотя это должен быть SHA1, без тегов или около того)
  • $graft-id = A (опять же, это должен быть SHA1)

Тогда данный еще более простой способ работает, как и ожидалось.

2 голосов
/ 22 мая 2011

Это довольно неясная особенность.

Если вам это нужно, вам лучше вдвойне убедиться, что вы точно знаете, как git работает за кулисами, и знаете, чего вы хотели достичь.

Кроме того, есть более новая, возможно, более полезная (по крайней мере, более гибкая) функция, которая называется git replace ( man page )

ИМХО, эта же документация содержит достаточно информации, если вам это действительно нужно.

Но см.

  1. https://git.wiki.kernel.org/index.php/GraftPoint
  2. Для чего нужны .git / info / grafts?
  3. http://bugsquash.blogspot.com/2010/03/stitching-git-histories.html
...