Je rencontre un problème où je veux synchroniser 2 dépôts qui ne sont pas connectés via le réseau. J'ai utilisé git bundle pour synchroniser les deux, mais j'ai rencontré un problème.
Je crée le bundle git via :
git bundle create --since=<timestamp of lastBundle> --all <my_bundle_path>
où <timestamp of lastBundle>
a été choisi à partir du temps de livraison associé à la lastBundle
étiquette. Cela me permet de ne regrouper que le delta et de récupérer tous les nouveaux commits dans toutes les branches.
Le cas limite est celui où ce scénario particulier se produit
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
a été synchronisé, et correspond à la référence la plus courante du repo airgapped, mais quelqu'un avait commis c2
plus tôt dans le temps que c3
dans leur propre copie locale du dépôt et n'ont pas poussé la référence vers l'origine immédiatement. Ainsi, la prochaine fois que je regrouperai chaque commit de lastBundle
et le mettre sur un disque, le charger sur l'autre machine, il échoue à valider car c2
n'est pas dans le paquet, seulement sa fusion vers master.
J'ai regardé git merge-base
pour voir si je peux trouver un ancêtre commun, et l'utiliser à la place. Bien que cela puisse faire l'affaire, je pense que j'aurais besoin d'un fichier lastBundle
pour chaque branche pour que cela fonctionne, puisque cette situation peut se produire sur 0, 1 ou plusieurs branches en même temps. Cela semble non optimal.
Idéalement, je pense que je voudrais pouvoir faire un git bundle verify <mybundle>
par rapport à un emplacement donné dans l'historique git, plutôt que par rapport à l'ensemble du dépôt. De cette façon, je pourrais vérifier qu'il échouera avant de le mettre sur le disque, et simplement changer la distance à laquelle je remonte pour les commits lors du regroupement. A moins qu'il n'y ait un autre moyen de faire ce que j'essaie de faire.
Des idées ?