Сохранение идентификатора коммита с помощью "git am"
Я попытался (в небольшом тестовом репозитории) экспортировать репозиторий в серию .patch
файлы, созданные с git format-patch
введите команду для каждого коммита, а затем восстановите репозиторий, используя "git init" в пустом каталоге, а затем git apply
Команда для каждого файла патча. Сработало --- только одна проблема ---- когда git am
применяет патч к хранилищу вместо сохранения ID-метки патча, он генерирует новый. Это может стать проблемой позже, так как это может затруднить определение того, какие коммиты являются избыточными, а какие нет.
Что касается того, почему я не использую нормальные методы клонирования репозитория, такие как git clone
- Ответ в том, что, вообще говоря, я использую git clone
клонировать репозиторий - но у меня есть очень конкретные причины, чтобы попытаться выяснить, могу ли я сделать это таким образом, которые слишком длинны, чтобы вдаваться в подробности (хотя я могу сослаться на причину позже в этом вопросе) - - и не только эти причины слишком длинные, но я не понимаю, как их окончательные подробности могут повлиять на правильный ответ на этот вопрос.
Однако, если вы скажете мне, что .patch
Неправильный формат файла для этой цели, для которого я открыт. Что наиболее важно, что я хочу сделать, это:
Извлечение отдельных коммитов в репо в отдельные файлы - и узнать порядок этих файлов в истории репо и т. Д.
Иметь возможность полностью восстановить репо на основе этих извлеченных версий коммитов
Позже я смогу "де-канонизировать" любой коммит, который я идентифицировал, который не должен был быть сделан (и который сохранение в истории репозитория не будет стоить раздувания, которое это вызвало бы для размера истории проекта), чтобы я мог восстановить репо без "канонизированных" фиксаций. (И, между прочим, аспект № 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) и сравнить их. Они должно быть идентичным