67 votes

Comment utiliser git-bundle pour garder développement de synchronisation?

J'ai besoin de garder mon développement arbres de synchronisation sur des ordinateurs différents, sans aucune connexion réseau entre eux.

Nous avons une centrale dépôt git, et j'ai l'habitude de travailler sur mon propre clone sur mon ordinateur de bureau. Parfois, j'ai besoin de faire un peu de développement sur un autre ordinateur, qui n'est jamais connecté au réseau d'entreprise. Aucun des ordinateurs sont jamais connecté à Internet. Le développement peut être effectuée sur les deux ordinateurs entre les synchronisations.

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

Pouvez-vous me donner quelques conseils ou des pointeurs?

110voto

Jefromi Points 127932

Les faisceaux de!

Le flux de travail avec git bundle va être essentiellement le même que n'importe quel autre flux de travail. Cela peut ne pas sembler terriblement utiles conseils, mais ici il est: quelle que soit l'utilisation de flux de travail que vous utilisez normalement, et de remplacer "push/pull" avec "porter un bundle de-ci de-là sur un lecteur flash, puis tirez".

La page de man a fait une assez bonne soluce pour arriver va avec, mais c'est plus d'un exemple. Par souci d'exhaustivité, voici une version légèrement modifiée de lui, en montrant comment déplacer des informations de deux façons:

# 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

La clé de chose à remarquer est que vous pouvez ajouter un bundle à distance, et d'interagir avec elle comme vous le feriez avec tout autre à distance. Pour mettre à jour à distance, il suffit de déposer dans un nouveau bundle, en remplacement de la précédente.

J'ai aussi pris une approche légèrement différente pour la sélection d'une base. La page de man utilise des balises, toujours tenus à jour avec les dernières références qui ont été transférés à l'autre hôte. J'ai simplement utilisé la distance branches, qui se rapportent à la dernière refs transféré de l'autre hôte. C'est un peu inefficace; vous finirez par le groupement de plus que vous avez besoin, puisque c'est un pas en arrière. Mais les lecteurs flash sont importantes, les grappes sont petites, et en utilisant les références que vous avez déjà, au lieu d'avoir à prendre une étape supplémentaire, et d'être prudent sur les balises permet d'économiser beaucoup d'efforts.

La chose qui rend les paquets, un peu de difficulté, c'est que vous ne pouvez pas pousser, et vous ne pouvez pas "rebase". Si vous souhaitez que le bundle fondé sur une nouvelle base, vous devez le recréer. Si vous voulez que les nouveaux s'engage en elle, vous avez à le recréer. Ce tracas donne lieu à ma suggestion suivante...

Repo sur une clé usb

Honnêtement, à moins que votre repo est vraiment grand, ce pourrait être aussi facile. Mettre nue un clone sur un disque de pouce, et vous pouvez pousser et tirer à partir de deux ordinateurs. Le traiter comme votre connexion réseau. Besoin de transférer à la centrale de pensions? Brancher!

9voto

Adam Points 17726

@Jefromi réponse a été grande - 10x mieux que le git docs, qui vont à longueur de propos incompréhensibles les exigences et les actions.

C'est toujours un peu compliqué, voici donc le cas le plus simple de la synchronisation une fois (dans mon cas: à PARTIR de: un mode hors connexion pour ordinateur portable cassé carte wifi: un bureau avec accès au net). @Jefromi réponse, cela semble bien fonctionner:

D'AVANCE = machine qui est en avance par certains nombre de commits. DERRIÈRE = machine que vous voulez copier les commits

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

Les DEUX: copie myBundleName.bundle (à l'aide d'e-mail, USB, peu importe)

DERRIÈRE: (placer le fichier myBundName.bundle n'importe où vous voulez à l'extérieur du dossier de projet)

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

Aussi longtemps que vous incluez la direction générale-nom sur la fin (par défaut, si vous n'êtes pas à l'aide de branches, de "maître"), cela semble bien fonctionner, et ne remplace pas les références sur le DERRIÈRE de sorte que vous pouvez toujours synchroniser/à partir de l'origine de maître.

c'est à dire si DERRIÈRE a accès à internet, il est toujours plus sûr de la faire:

(OPTIONAL) 4. BEHIND: git push

...et il va mettre à jour le référentiel principal, comme si vos changements ont été fait au niveau local, comme d'habitude, sur le DERRIÈRE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X