Для чего нужны .git / info / grafts? - PullRequest
47 голосов
/ 02 октября 2008

Я пытаюсь выяснить, что такое «прививки» в Git.

Например, в одном из последних комментариев здесь Тобу предполагает использовать git-filter-branch и .git / info / grafts для присоединения два хранилища.

Но я не понимаю, зачем мне эти трансплантаты ? Кажется, что все работают без двух последних команд.

Ответы [ 3 ]

36 голосов
/ 02 октября 2008

С Git Wiki :

Точки прививки или трансплантаты позволяют два в противном случае разные линии развитие должно быть объединено. Это работает, позволяя пользователям записывать подделку информация о происхождении коммитов. это как вы можете сделать Git притворяться из родителей коммит отличается из того, что было записано, когда совершить был создан.

Причины использования трансплантатов

Графты могут быть полезны при движении разработка мерзавца, так как она позволяет вам сделать клонирование старой истории импортировать из другого SCM необязательно. Это сохраняет первоначальный клон для пользователей кто просто хочет следовать последним версия вниз, в то время как разработчики могут иметь полная история развития имеется.

Когда Линус начал использовать git для поддерживая его дерево ядра там не было никаких инструментов для преобразования старая история ядра. Позже, когда старая история ядра была импортирована в мерзавец от шлюза bkcvs, прививки были создан как способ сделать это можно связать два разных хранилища вместе.

8 голосов
/ 14 апреля 2011

При работе с git-svn:

Git-трансплантаты очень полезны для импорта дерева Git в хранилище Subversion.

например. Для начала я создал локальный репозиторий Git. После нескольких дней работы над ним и создания множества коммитов мне пришлось опубликовать его в центральном репозитории Subversion, и я не хотел терять историю.

Я нашел следующую статью с практическими рекомендациями: http://eikke.com/importing-a-git-tree-into-a-subversion-repository/

7 голосов
/ 24 мая 2018

Подход трансплантатов упомянутый от Крис Джонсен для объединения двух репозиториев больше не полностью действителен (только с трансплантатами).
В Git 2.18 (Q2 2018) функциональность "$GIT_DIR/info/grafts" была заменена механизмом "refs/replace/" (в течение некоторого времени).
Внутренний код имел поддержку для этого во многих местах, который был очищен чтобы опустить механизм «трансплантатов» .

См. commit a3694d9 , commit f42fa47 , commit 8d0d81a , commit e2d65c1 , commit f9f99b3 , commit 0115e03 , commit fb40429 , commit 041c98e , commit e24e871 (28 апреля 2018) и commit d398f2e , коммит fef461e , коммит c5aa6db (25 апреля 2018 г.) от Йоханнес Шинделин (dscho) .
(Объединено Junio ​​C Hamano - gitster - в коммит 352cf6c , 23 мая 2018 г.)

Так что вместо

echo "$commit-id $graft-id" >> .git/info/grafts

Теперь вы делаете:

git replace --graft $commit-id $graft-id
git filter-branch $graft-id..HEAD

Устаревшая поддержка .git/info/grafts

Функция прививки была удобным способом «сшить» древние история к новому началу linux.git.

Его реализация, однако, не соответствует стандартам Git, так как слишком много способов, где это может привести к неожиданному и нежелательному поведению.

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

Кроме того, функция прививки ограничена списком «переписывания» коммитов родители, это ничего не может заменить.

Более молодая функция, реализованная как git replace, предназначена для исправления эти ограничения и опасные ошибки.

Считается, что git replace уже достаточно зрелый (с 4228e8b (заменить: добавить --graft опция, 2014-07-19, Git 2.1.0) он может выполнить прививку обязанности файла), пришло время отказаться от поддержки файла пересадки, и в конце концов уйти в отставку.

Теперь (снова Git 2.18, Q2 2018) у вас есть:

replace: добавить --graft опция

Строка использования для этой опции:

git replace [-f] --graft <commit> [<parent>...]

Сначала мы создаем новый коммит, который совпадает с <commit> за исключением того, что его родители [<parents>...]

Затем мы создаем ref ref, который заменяется на коммит, который мы только что создали.

С этой новой опцией, это должно быть просто конвертировать графты для замены ссылок.


А до Git 2.20 (Q4 2018) недавно введенные вспомогательные данные графа коммитов несовместимы с такими механизмами, как replace & grafts, которые «нарушают» неизменный характер ссылочных отношений объекта.
Отключить оптимизацию на основе его использования (и обновления существующего графика изменений), когда эти несовместимые функции используются в хранилище.

См. коммит 829a321 , коммит 5cef295 , коммит 20fd6d5 , коммит d653824 , коммит b775896 , коммит 950c62b (20 августа 2018 г.) Деррик Столи (derrickstolee) .
См. коммит 212e0f7 , коммит 4a6067c (20 августа 2018 г.) от Стефан Беллер (stefanbeller) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 6d8f8eb , 16 октября 2018 г.)

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