Сохранение идентификатора коммита с помощью "git am"

Я попытался (в небольшом тестовом репозитории) экспортировать репозиторий в серию .patch файлы, созданные с git format-patch введите команду для каждого коммита, а затем восстановите репозиторий, используя "git init" в пустом каталоге, а затем git apply Команда для каждого файла патча. Сработало --- только одна проблема ---- когда git am применяет патч к хранилищу вместо сохранения ID-метки патча, он генерирует новый. Это может стать проблемой позже, так как это может затруднить определение того, какие коммиты являются избыточными, а какие нет.

Что касается того, почему я не использую нормальные методы клонирования репозитория, такие как git clone - Ответ в том, что, вообще говоря, я использую git clone клонировать репозиторий - но у меня есть очень конкретные причины, чтобы попытаться выяснить, могу ли я сделать это таким образом, которые слишком длинны, чтобы вдаваться в подробности (хотя я могу сослаться на причину позже в этом вопросе) - - и не только эти причины слишком длинные, но я не понимаю, как их окончательные подробности могут повлиять на правильный ответ на этот вопрос.

Однако, если вы скажете мне, что .patch Неправильный формат файла для этой цели, для которого я открыт. Что наиболее важно, что я хочу сделать, это:

  1. Извлечение отдельных коммитов в репо в отдельные файлы - и узнать порядок этих файлов в истории репо и т. Д.

  2. Иметь возможность полностью восстановить репо на основе этих извлеченных версий коммитов

  3. Позже я смогу "де-канонизировать" любой коммит, который я идентифицировал, который не должен был быть сделан (и который сохранение в истории репозитория не будет стоить раздувания, которое это вызвало бы для размера истории проекта), чтобы я мог восстановить репо без "канонизированных" фиксаций. (И, между прочим, аспект № 3 очень сильно связан с причиной, по которой я хочу сделать это.)

1 ответ

Я не на 100% понимаю, что вы здесь спрашиваете. Я предполагаю, что когда вы говорите "commit ID-tag", вы имеете в виду SHA. И я вообще не знаю, что вы подразумеваете под "патч-тегом".

Так что гадать...

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

Они не должны делать. Вы можете переопределить их через GIT_AUTHOR_NAME и аналогичные переменные среды. Если вы выберете вишню или сделаете ребаз, это изменит их.

Когда ты бежишь git format-patch он вообще не предоставляет вам информацию о коммиттере. Точно так же, когда вы бежите git am он не ищет информацию о коммитере, а перезаписывает ее именем и адресом электронной почты того, кто работает git am, Это приведет к созданию другого SHA, если эта информация изменится.

Нелегкий способ обойти это (вам нужно было бы взломать и format-patch, и am, чтобы сохранить информацию о комитере. Однако вместо сравнения SHA для коммитов вы могли бы вычислить ID Patch для фиксации (git patch-id) и сравнить их. Они должно быть идентичным

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