web-dev-qa-db-fra.com

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

Je dois synchroniser mes arborescences de développement sur différents ordinateurs, sans connexion réseau entre eux.

Nous avons un référentiel central git, et je travaille normalement sur mon propre clone sur mon ordinateur de bureau. Parfois, j'ai besoin de faire du développement sur un autre ordinateur, qui n'est jamais connecté au réseau du bureau. Aucun ordinateur n'est connecté à Internet. Le développement peut être effectué sur les deux ordinateurs entre les synchronisations.

J'ai lu les pages d'aide pour git-bundle , ce qui semble être le meilleur outil, mais je ne sais pas vraiment comment un bon flux de travail pourrait être mis en place.

Pouvez-vous me donner des conseils ou des conseils?

66
matli

Liasses!

Le workflow avec git bundle sera essentiellement le même que tout autre workflow. Cela peut ne pas sembler être un conseil extrêmement utile, mais le voici: utilisez le flux de travail que vous utiliseriez normalement et remplacez "Push/pull" par "transportez un paquet ici et là sur un lecteur flash, puis tirez".

La page de manuel a en fait une assez bonne procédure pas à pas pour commencer, bien qu'il s'agisse plus d'un exemple à sens unique. Par souci d'exhaustivité, voici une version légèrement modifiée de celui-ci, montrant comment déplacer les informations dans les deux sens:

# on hostA, the initial home of the repo
hostA$ git bundle create hostA.bundle --branches --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 branches 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 --branches --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 branches 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 --branches --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 ajouter un bundle 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 pack, 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 qui ont été transférées à l'autre hôte. J'ai simplement utilisé les branches 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 regrouper plus que nécessaire, car c'est un pas en arrière. Mais les lecteurs flash sont gros, les bundles sont petits, et utiliser les références que vous avez déjà au lieu d'avoir à faire un pas supplémentaire et à faire attention aux balises économise beaucoup d'efforts.

La seule chose qui rend les bundles un peu problématiques est que vous ne pouvez pas les pousser et que 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. Ce tracas donne lieu à ma prochaine suggestion ...

Repo sur une clé USB

Honnêtement, à moins que votre repo ne soit vraiment important, cela pourrait être tout aussi facile. Mettez un clone nu sur une clé USB, et vous pouvez pousser et tirer depuis les deux ordinateurs. Traitez-le comme votre connexion réseau. Besoin de transfert au dépôt central? Branche le!

110
Cascabel

@Jefromi a été une excellente réponse - 10 fois mieux que les git docs, qui parlent longuement d'exigences et d'actions incompréhensibles.

C'est encore un peu compliqué, alors voici le cas le plus simple à synchroniser une fois (dans mon cas: DE: un ordinateur portable hors ligne avec une carte wifi cassée, À: un bureau avec accès net). D'après la réponse de @ Jefromi, cela semble bien fonctionner:

AHEAD = machine en avance d'un certain nombre de validations. DERRIÈRE = machine sur laquelle vous souhaitez copier les validations

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

LES DEUX: copiez myBundleName.bundle (par e-mail, USB, etc.)

DERRIÈRE: (placez le fichier myBundName.bundle où vous voulez extérieur le 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 branche à la fin (par défaut, si vous n'utilisez pas de branches, "master"), cela semble fonctionner correctement et ne remplace aucune des références internes sur DERRIÈRE - donc vous peut toujours se synchroniser vers/depuis le maître d'origine.

par exemple, si DERRIÈRE a accès à Internet, il est toujours possible de faire:

(OPTIONAL) 4. BEHIND: git Push

... et il mettra à jour le référentiel principal, comme si vos modifications avaient été effectuées localement, comme d'habitude, sur DERRIÈRE.

9
Adam