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?
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.
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:
.git
et déplacez-y tous les fichiers du référentiel nu..git/config
pour changer bare = true
en bare = false
Vous pouvez définir l'attribut Caché dans le répertoire .git
sous Windows, mais not dans les fichiers qu'il contient.
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
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.
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.
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