Инфраструктура: у меня два хоста (А и Б). Я не могу подключиться от A к B или наоборот. Нет хоста C, доступного с хоста A и хоста B. Я могу отправлять электронные письма в обоих направлениях. Текстовые вложения разрешены. Другие вложения не допускаются. Могут быть другие проблемы...
Я хочу клонировать репозиторий git с хоста A на хост B. Я хочу иметь возможность работать на обоих хостах. Я хочу подтолкнуть свои коммиты от A к B и наоборот.
Вопрос. Есть ли простой способ передачи коммитов (подходящий для моей инфраструктуры)?
Я пробовал: я могу использовать git format-patch
для создания текстовых версий моих коммитов. Но в сгенерированных файлах есть только дата автора. Дата коммиттера отсутствует. И родительский коммит отсутствует. Я могу посмотреть на другом хосте - так что я знаю обе информации. Затем я могу использовать git commit
с GIT_AUTHOR_DATE
и GIT_COMMITER_DATE
для создания фиксации с правильным хэшем фиксации.
Это работает :) Но мне нужно ввести несколько команд. И если я хочу передать больше коммитов, мне нужно ввести еще несколько команд.
Спасибо, не знал git bundle
. Это проще, чем мой GIT_AUTHOR_DATE
-GIT_COMMITER_DATE
-хак (который тоже сохраняет даты). Я попробую это подробно, но на данный момент это кажется решением.
Даты не могут быть сохранены, если исходная фиксация содержала дату автора, отличную от даты коммитера. После импорта обе даты будут идентичными.
Я пробовал GIT_AUTHOR_DATE = "2023-04-08T00:00:00" GIT_COMMITTER_DATE = "2023-04-09T12:34:56" git commit -m "..."
. А потом git cat-file -p head
. Временные метки в author
-строке и committer
-строке разные. Так что я думаю, что с моим хаком временные метки можно сохранить. Что я неправильно понимаю?
Да, даты разные. Теперь создайте патч с помощью format-patch
и примените его в другом репо. Что происходит с датой автора и коммиттера? Дата автора сохранена, дата коммиттера "сейчас". Если вы заставите дату коммиттера совпадать с датой автора патча, у вас теперь будет фиксация с двумя идентичными датами (что отличается от патча перед фиксацией). Может быть, я неправильно понимаю, и вы просматриваете каждую фиксацию с хоста A, чтобы переопределить дату автора и коммиттера?
То есть то, что я описал как «работает». Я могу установить правильную дату коммиттера и автора. Итак, я могу заставить правильный хэш коммита. Но «решение» не очень хорошее, потому что мне приходится переделывать каждый коммит. Ваше предложение git bundle
лучше. Намного лучше.
Вы можете использовать git bundle для создания архива ссылок. Со страницы руководства:
Создавайте, распаковывайте и манипулируйте «пакетными» файлами. Пакеты используются для «автономной» передачи объектов Git без активного «сервера», находящегося на другой стороне сетевого подключения.
Их можно использовать для создания как инкрементных, так и полных резервных копий репозитория, а также для передачи состояния ссылок в одном репозитории в другой.
Поскольку требуется «только текст», вы можете затем закодировать пакет в шестнадцатеричном или base64
кодировании, чтобы получить текстовое представление, которое можно вернуть на принимающем хосте.
Еще одно быстрое и грязное решение — tar
репозиторий и кодирование в виде текста. Использование этого подхода не может выполнять добавочные обновления по очевидным причинам.
Оба решения позволяют избежать проблем с информацией о коммиттере и авторе. Установка author == committer теряет информацию, если исходный репозиторий (на хосте A) содержит коммиты с разными данными об авторе и коммиттере.
git bundle
илиtar
, а затемbase64
закодировать все это?format-patch
приведет к новым, другим коммитам (даты/информация автора и коммиттера не обязательно должны совпадать в исходном репо).