Comment git regrouper un dépôt complet

116

J'ai besoin de transférer un dépôt complet sur une nouvelle machine non connectée au réseau, de préférence en tant qu'entité de fichier unique. Le paquet git permet git fetch, git pullopération de style dans un environnement sneakernet mais semble supposer que vous avez déjà une version de travail de la mise en pension sur la machine de destination.

Quelle est la bonne invocation pour:

  1. Regroupez toutes les branches du référentiel actuel
  2. Démarrez le nouveau dépôt sur le répertoire de destination, c'est-à-dire que le commit racine est correctement installé

J'ai envoyé un correctif en amont pour clarifier:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

Donc, le $ git bundle create repo.bundle --branches --tagsmeilleur correspond au clonage.

$ git bundle create repo.bundle --all fournira une image miroir de votre machine source, y compris ses références distantes.

Philip Oakley
la source

Réponses:

190

Quelle est la bonne invocation pour:

  • Regroupez toutes les branches du référentiel actuel

Facile:

$ git bundle create repo.bundle --all

Voici repo.bundlele nom du fichier bundle que vous souhaitez créer. Notez que --allcela n'inclurait pas les branches de suivi à distance ... tout comme le clone ordinaire ne le ferait pas non plus.

  • Démarrez le nouveau dépôt sur le répertoire de destination, c'est-à-dire que le commit racine est correctement installé

Tout d'abord, clonec'est juste init+ fetch(+ administrativia).

Deuxièmement, vous pouvez utiliser le fichier bundle partout où l'URL du référentiel peut être utilisée, donc vous pouvez simplement à clonepartir d'un fichier bundle:

$ git clone repo.bundle

Cela créerait repoun dépôt git.

Jakub Narębski
la source
6
Merci, les --alloptions ne sont pas dans ma page de manuel pour bundle(je regarde la version 1.7.6.msysgit.0), ni l'utilisation du fichier .bundle dans la section URL pour clone. Cela me donne une plus grande confiance pour recommander son utilisation.
Philip Oakley
20
Le synopsis de la commande create est git bundle create <file> <git-rev-list-args>. Courir man git-rev-list(ou man git-log) vous donnerait --all. Mais je suis d'accord qu'il devrait être plus visible dans la documentation de la commande bundle.
Jakub Narębski
1
Je vois que la page de manuel du bundle, sous Specifying References, dit qu'elle "ne mettra en package que les références qui sont affichées par git show-ref", ce qui n'inclut pas [list] les options de git-rev-list.
Philip Oakley
2
@Philip Oakley: C'est git-rev-list-argsainsi que vous sélectionnez les références affichées par git show-refcommande.
Jakub Narębski
2
--alla inclus des branches de suivi à distance pour moi (git 2.1.4). Je pourrais voir refs/remotes/origin/*avec git bundle list-heads bundlefileou git ls-remote bundlefile. Bien que les récupérer à partir du lot soit peu délicat.
Alex
33

Clonez d'abord le référentiel et incluez l' --mirroroption.

git clone --mirror [email protected]:path/repo.git

Cela garantit que toutes les succursales distantes sont également des succursales locales prêtes à être regroupées.

Puis cours

git bundle create repo.bundle --all comme décrit par la réponse de Jakub Narębski

thoutbeckers
la source
3

Je vous suggère de tarer ou de compresser le dossier .git et de le décompresser simplement dans le nouvel emplacement, puis de le faire git reset --hard HEAD. Tout ce qui est requis pour toutes les branches est sous .git et tout ce que vous devez faire est d'ajuster les télécommandes dans le fichier .git / config ou de les supprimer.

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD
patthoyts
la source
4
Une mise en garde est que vous devrez consulter le fichier .git / config pour vérifier si le propriétaire du dépôt d'origine avait des éléments spécifiques à l'utilisateur.
Noufal Ibrahim
@patthoyts: Étant donné qu'il est déconnecté, il n'y aurait pas de télécommande ;-) Il semble que le bundle manque (peut-être) une option, et peut-être cloné (il faut penser au clonage à partir d'un bundle)
Philip Oakley