Использование git bundle для синхронизации репозиториев

Я столкнулся с проблемой, из-за которой я хочу синхронизировать 2 репозитория, которые не подключены через сеть. Я использовал git bundle для синхронизации между ними, но столкнулся с угловым случаем.

Я создаю пакет git через:

git bundle create --since=<timestamp of lastBundle> --all <my_bundle_path>

где <timestamp of lastBundle> был выбран из времени коммита, связанного с lastBundle тег. Это позволяет мне связывать только дельту и собирать все новые коммиты во всех ветках.

Угловой случай, когда происходит этот конкретный сценарий

master               2017-12-4 <dev who committed c2 finally gets around to pushing it to origin>
|\
| \
|  c3 <lastBundle>   2017-12-3 <commit that was synched>
|   |
c2  |                2017-12-2 <commit from dev, timestamped to when s/he committed it to their local repo>
 \  |
  \ |
   c1                2017-12-1 <base commit>

lastBundle был синхронизирован и соответствует самой последней ссылке на репозиторий с воздушным зазором, но кто-то совершил c2 раньше времени c3 в их собственной локальной копии репо и не сразу подтолкнул ссылку на источник. Таким образом, в следующий раз я связываю каждый коммит из lastBundle и положить его на диск, загрузить его на другую машину, он не может проверить, потому что c2 не в связке, только его слияние с мастером.

Я смотрел на git merge-base чтобы узнать, смогу ли я найти общего предка и использовать его вместо этого. Хотя это может сделать работу, я думаю, что мне нужно lastBundle тег для каждой ветви, чтобы она работала, поскольку такая ситуация может возникнуть в 0, 1 или более ветвях одновременно. Это кажется неоптимальным.

В идеале я думаю, что хотел бы иметь возможность сделать git bundle verify <mybundle> в отношении заданного места в истории git, а не всего хранилища. Таким образом, я мог проверить, что он потерпит неудачу, прежде чем я положу его на диск, и просто изменить, насколько далеко я захожу для коммитов при упаковке. Если нет другого пути к тому, что я пытаюсь сделать.

Есть идеи?

1 ответ

Решение

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

git bundle create foo.bundle --branches
git fetch foo.bundle 'refs/heads/*:refs/remotes/sent/*'
....
git bundle create foo.bundle --branches --not --remotes sent
git fetch...
Другие вопросы по тегам