Comment utiliser git-bundle pour maintenir le développement synchronisé?

Je dois garder mes arbres de développement synchronisés sur différents ordinateurs, sans connexion réseau entre eux.

Nous avons un repository central de git, et je travaille normalement sur mon propre clone sur mon ordinateur de bureau. Parfois, je dois effectuer du développement sur un autre ordinateur, qui n’est jamais connecté au réseau du bureau. Aucun des ordinateurs n’est connecté à Internet. Le développement peut être effectué sur les deux ordinateurs entre les synchronisations.

J’ai lu les pages d’aide de git-bundle , qui semble être le meilleur outil, mais je ne suis pas sûr de la manière dont un bon workflow pourrait être configuré.

Pouvez-vous me donner des conseils ou des conseils?

Liasses!

Le stream de travail avec git bundle sera essentiellement le même que tout autre workflow. Cela peut ne pas sembler un conseil très utile, mais le voici: utilisez n’importe quel stream de travail que vous utiliseriez normalement, et remplacez “push / pull” par “emportez un bundle ici sur un lecteur flash, puis tirez”.

La page de manuel contient en fait une bonne solution pour y parvenir, bien que ce soit un exemple à sens unique. Par souci d’exhaustivité, voici une version légèrement modifiée, montrant comment déplacer les informations dans les deux sens:

# on hostA, the initial home of the repo hostA$ git bundle create hostA.bundle --twigs --tags # transfer the bundle to hostB, and continue: hostB$ git clone /path/to/hostA.bundle my-repo # you now have a clone, complete with remote twigs and tags # just to make it a little more obvious, rename the remote: hostB$ git remote rename origin hostA # make some commits on hostB; time to transfer back to hostA # use the known master branch of hostA as a basis hostB$ git bundle create hostB.bundle ^hostA/master --twigs --tags # copy the bundle back over to hostA and continue: hostA$ git remote add hostB /path/to/hostB.bundle # fetch all the refs from the remote (creating remote twigs like hostB/master) hostA$ git fetch hostB # pull from hostB's master, for example hostA$ git pull # make some commits on hostA; time to transfer to hostB # again, use the known master branch as a basis hostA$ git bundle create hostA.bundle ^hostB/master --twigs --tags # copy the bundle to hostB, **replacing** the original bundle # update all the refs hostB$ git fetch hostA # and so on and so on 

L’essentiel à noter est que vous pouvez append un lot en tant que télécommande et interagir avec lui comme vous le feriez avec n’importe quelle autre télécommande. Pour mettre à jour cette télécommande, déposez simplement un nouveau bundle, en remplaçant le précédent.

J’ai également adopté une approche légèrement différente pour choisir une base. La page de manuel utilise des balises, toujours à jour avec les dernières références transférées à l’autre hôte. J’ai simplement utilisé les twigs distantes, qui feront référence aux dernières références transférées de l’autre hôte. C’est un peu inefficace. vous finirez par empocher plus que vous en avez besoin, puisque cela fait un pas en arrière. Mais les clés USB sont volumineuses, les offres groupées sont réduites et l’utilisation des références que vous avez déjà au lieu de faire un pas supplémentaire et de faire attention aux balises vous évite beaucoup d’efforts.

La seule chose qui rend les paquets un peu difficiles, c’est que vous ne pouvez pas les pousser, et vous ne pouvez pas les “rebaser”. Si vous souhaitez que le bundle soit basé sur une nouvelle base, vous devez le recréer. Si vous voulez de nouveaux commits, vous devez le recréer. Cette dispute donne lieu à ma prochaine suggestion …

Repo sur une clé USB

Honnêtement, à moins que votre repo soit vraiment gros, cela pourrait être aussi simple. Mettez un clone nu sur une clé USB et vous pourrez le pousser et l’extraire des deux ordinateurs. Traitez-le comme votre connexion réseau. Besoin de transférer au repo central? Branche le!

@Jefromi answer était génial – 10 fois mieux que les git docs, qui traitent en détail des exigences et des actions incompréhensibles.

C’est quand même un peu compliqué, alors voici la synchronisation la plus simple (dans mon cas: DE: un ordinateur portable hors ligne avec carte wifi cassée, TO: un bureau avec un access net). Sur la base de la réponse de @ Jefromi, cela semble bien fonctionner:

AHEAD = machine en avance sur un certain nombre de commits. BEHIND = machine que vous souhaitez copier les commits

 1. AHEAD: git-bundle create myBundleName.bundle --twigs --tags 

BOTH: copie myBundleName.bundle (en utilisant l’email, USB, peu importe)

DERRIÈRE: (placez le fichier myBundName.bundle partout où vous voulez en dehors du dossier du projet)

 2. BEHIND: cd [the project folder] 3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master 

Tant que vous incluez le nom de la twig à la fin (par défaut, si vous n’utilisez pas les twigs “master”), cela semble fonctionner correctement et ne remplace aucune des références internes de BEHIND – vous avez donc peut toujours synchroniser vers / depuis le maître d’origine.

Par exemple, si BEHIND a access à Internet, il est toujours prudent de le faire:

 (OPTIONAL) 4. BEHIND: git push 

… et il mettra à jour le référentiel principal, comme si vos modifications avaient été effectuées localement, normalement, sur BEHIND.