Можно ли использовать мерзавцы после деления большого репо?
Возьмем случай, когда большой кусок некоторого родительского репозитория берется в качестве основной отправной точки для другого дочернего репозитория, удаляется из оригинала и вместо этого создает подмодуль. (Все это уже завершено и осталось в прошлом.)
я вижу это .git/info/grafts
позволит сохранить историю для git-blame
а также git-annotate
и, возможно, может быть использован ex post facto.
Однако что делать, если файлы не совпадают? Например, одна версия была удалена из старого исходного родительского репозитория, а слегка измененная версия была добавлена в новый дочерний субмодуль? Можно ли еще сделать ссылку? Особенно, если оба хранилища продолжают обновляться, и вам не придется иметь дело с переписыванием какой-либо прошлой истории (больше, чем нужно).
1 ответ
Комитеты не содержат ссылок на diff-файлы, они содержат ссылки на деревья, где дерево - это то, как должен выглядеть ваш рабочий каталог. Если у вас есть коммит A с деревом 1, и коммит B с деревом 2, то когда вы просите показать разницу между A и B, git вычисляет разницу между деревом 1 и деревом 2.
Исходя из этого, должно быть немного яснее, что не имеет значения, что файлы не на 100% идентичны при прививке. Однако, если они не идентичны на 100%, любые различия будут (правильно) показаны, когда вы попросите показать коммит.
Обратите внимание, что хотя это обычно не связано с подмодулями, подмодули используют независимые gitdirs, поэтому родительская история не доступна автоматически. Вам нужно будет убедиться, что вы получили нужную историю, прежде чем у прививки появится хоть какой-то шанс на работу. Кроме того, прививка является локальной операцией. Другие, клонирующие ваш репозиторий, не смогут получить прививки. Вы можете рассмотреть git replace
вместо этого, который использует регулярные ссылки и который должен быть выбран другими, которые хотят их.