web-dev-qa-db-fra.com

Obtenir une copie de travail d'un référentiel nu

J'ai un serveur sur lequel j'ai un dépôt nu pour pousser. Cependant, mon serveur doit avoir une copie de travail de la branche principale.

Comment obtenir une copie de travail et cela uniquement à partir d'un référentiel nu?

23
Jonathan Allard

Vous pouvez simplement cloner le référentiel dans un autre répertoire sur le même ordinateur:

git clone /bare/repo/dir.git

Le répertoire en cours deviendra un clone non-nu de votre référentiel et vous obtiendrez automatiquement une extraction de la branche master. Ensuite, utilisez les commandes habituelles comme git pull pour le mettre à jour si nécessaire.

En contrepartie, cette opération est très efficace: si vous spécifiez un répertoire local sur git clone, git tentera de partager des objets entre ces deux dépôts à l’aide de liens physiques.

25
user4815162342

Un référentiel nu est simplement le répertoire .git d'un répertoire de travail et une entrée dans le fichier de configuration local. Ce que j'ai fait pour convertir un référentiel nu en un répertoire complet est:

  • Créez un nouveau sous-répertoire .git et déplacez-y tous les fichiers du référentiel nu.
  • Editez le fichier .git/config pour changer bare = true en bare = false
  • Découvrez la branche que vous voulez. Cela extrait tous les fichiers du référentiel dans le répertoire de travail.

Vous pouvez définir l'attribut Caché dans le répertoire .git sous Windows, mais not dans les fichiers qu'il contient.

10
ygoe

Je cherchais l'approche "arbre de travail détaché" (comme vu ici ):

git init --bare

git config core.bare false
git config core.worktree /somewhere/else/

git checkout -f
10
Jonathan Allard

Ceci est un riff des 2 autres réponses mais il comble le vide pour mon cas d'utilisation - cela fonctionne pour mettre à jour le référentiel à partir de l'origine et extraire les branches et toutes les opérations git car vous vous retrouvez avec un référentiel git complet normal.

git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url Origin [email protected]:Swift/swift.git

Après avoir exécuté ces 3 lignes de code, vous pouvez alors git pull et git branch et git checkout some_branch et ainsi de suite, car un référentiel git complet et normal est maintenant connecté à votre référentiel distant.

3
GregT

Voilà comment cela fonctionne:

$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .

Voilà!

Pour info: git init rapportera: Reinitialized existing Git repository in /path/to/existing-bare-repository. Mais soyez confiant. man git-init dit: L'exécution de git init dans un référentiel existant est sûre. Cela n'écrasera pas les choses qui sont déjà là.

La magie est que git init seul ne fait pas que vos fichiers apparaissent dans le répertoire de travail. Vous devez vérifier le répertoire racine.

1
Adrian W

Vous pouvez utiliser 'git show' pour cela.

http://www.kernel.org/pub/software/scm/git/docs/git-show.html

Fondamentalement:

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt
0
Ben Martin