Как клонировать репозиторий git без подключения к сети

Инфраструктура: у меня два хоста (А и Б). Я не могу подключиться от A к B или наоборот. Нет хоста C, доступного с хоста A и хоста B. Я могу отправлять электронные письма в обоих направлениях. Текстовые вложения разрешены. Другие вложения не допускаются. Могут быть другие проблемы...

Я хочу клонировать репозиторий git с хоста A на хост B. Я хочу иметь возможность работать на обоих хостах. Я хочу подтолкнуть свои коммиты от A к B и наоборот.

Вопрос. Есть ли простой способ передачи коммитов (подходящий для моей инфраструктуры)?

Я пробовал: я могу использовать git format-patch для создания текстовых версий моих коммитов. Но в сгенерированных файлах есть только дата автора. Дата коммиттера отсутствует. И родительский коммит отсутствует. Я могу посмотреть на другом хосте - так что я знаю обе информации. Затем я могу использовать git commit с GIT_AUTHOR_DATE и GIT_COMMITER_DATE для создания фиксации с правильным хэшем фиксации.

Это работает :) Но мне нужно ввести несколько команд. И если я хочу передать больше коммитов, мне нужно ввести еще несколько команд.

git bundle или tar, а затем base64 закодировать все это? format-patch приведет к новым, другим коммитам (даты/информация автора и коммиттера не обязательно должны совпадать в исходном репо).
knittl 12.04.2023 14:11

Спасибо, не знал git bundle. Это проще, чем мой GIT_AUTHOR_DATE-GIT_COMMITER_DATE-хак (который тоже сохраняет даты). Я попробую это подробно, но на данный момент это кажется решением.

Shear Plane 12.04.2023 14:41

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

knittl 12.04.2023 15:18

Я пробовал 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-строке разные. Так что я думаю, что с моим хаком временные метки можно сохранить. Что я неправильно понимаю?

Shear Plane 12.04.2023 15:26

Да, даты разные. Теперь создайте патч с помощью format-patch и примените его в другом репо. Что происходит с датой автора и коммиттера? Дата автора сохранена, дата коммиттера "сейчас". Если вы заставите дату коммиттера совпадать с датой автора патча, у вас теперь будет фиксация с двумя идентичными датами (что отличается от патча перед фиксацией). Может быть, я неправильно понимаю, и вы просматриваете каждую фиксацию с хоста A, чтобы переопределить дату автора и коммиттера?

knittl 12.04.2023 15:29

То есть то, что я описал как «работает». Я могу установить правильную дату коммиттера и автора. Итак, я могу заставить правильный хэш коммита. Но «решение» не очень хорошее, потому что мне приходится переделывать каждый коммит. Ваше предложение git bundle лучше. Намного лучше.

Shear Plane 12.04.2023 16:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать git bundle для создания архива ссылок. Со страницы руководства:

Создавайте, распаковывайте и манипулируйте «пакетными» файлами. Пакеты используются для «автономной» передачи объектов Git без активного «сервера», находящегося на другой стороне сетевого подключения.

Их можно использовать для создания как инкрементных, так и полных резервных копий репозитория, а также для передачи состояния ссылок в одном репозитории в другой.

Поскольку требуется «только текст», вы можете затем закодировать пакет в шестнадцатеричном или base64 кодировании, чтобы получить текстовое представление, которое можно вернуть на принимающем хосте.

Еще одно быстрое и грязное решение — tar репозиторий и кодирование в виде текста. Использование этого подхода не может выполнять добавочные обновления по очевидным причинам.

Оба решения позволяют избежать проблем с информацией о коммиттере и авторе. Установка author == committer теряет информацию, если исходный репозиторий (на хосте A) содержит коммиты с разными данными об авторе и коммиттере.

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

Git Large File Storage не отправляется в репозиторий, несмотря на успешную загрузку объектов LFS
Почему у меня вдруг нет разрешения на отправку?
Проблема с Git "фатальная: удаленный конец неожиданно завис"
Ошибка Git push: сбой RPC; curl 55 SSL_write() вернул SYSCALL, errno = 10053. Интернет-соединение в порядке, попытался увеличить размер буфера
В GitHub, как я могу предоставить приложению разрешения на фиксацию ветки с защитой?
Разрешение «удалить ветку» без разрешения «переписать историю» в Azure DevOps
Унифицированные обновления: обновляйте частное репо обновлениями из локальных файлов (рефакторинг, переименование, обновление) и получайте регулярные обновления из исходного репо
Невозможно зафиксировать или отправить обновления в мастер после их добавления
Как я могу нажать Git Bash с предупреждением: не удалось найти помощник пользовательского интерфейса «GitHub.UI»?
Почему этот человек (см. ссылку на статью) использует checkout для создания функциональной ветки из ветки разработки, а не для получения?