Использование 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...