Для чего нужны.git/info/grafts?

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

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

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

3 ответа

Из Git Wiki:

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

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

Прививки могут быть полезны при переносе разработки в git, так как это позволяет сделать клонирование старой истории, импортированной из другого SCM, необязательным. Это сохраняет первоначальный клон для пользователей, которые просто хотят следить за последней версией, в то время как разработчики могут иметь полную доступную историю разработки.

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

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

См. Коммит a3694d9, коммит f42fa47, коммит 8d0d81a, коммит e2d65c1, коммит f9f99b3, коммит 0115e03, коммит fb40429, коммит 041c98e, коммит e24e871 (28 апреля 2018 г.) и коммит d398f2e, коммит fef461e, коммит c5aa8din 25 июня (5) ( dscho )
(Объединено Юнио С Хамано - 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 option, 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 г.). Автор Derrick Stolee ( derrickstolee )
См. Коммит 212e0f7, коммит 4a6067c (20 августа 2018 г.). Автор Stefan Beller ( stefanbeller )
(Объединено Юнио С Хамано - gitster - в коммите 6d8f8eb, 16 октября 2018 г.)

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

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

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

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

Другие вопросы по тегам