web-dev-qa-db-fra.com

Comment convertir un dépôt Git normal en un dépôt nu?

Comment puis-je convertir un référentiel Git 'normal' en un dépôt nu?

La principale différence semble être:

  • dans le référentiel git normal, vous avez un dossier .git dans le référentiel contenant toutes les données pertinentes et tous les autres fichiers constituant votre copie de travail.

  • dans un référentiel Git nu, il n'y a pas de copie de travail et le dossier (appelons-le repo.git) contient les données réelles du référentiel.

569
Boldewyn

En bref: remplacez le contenu de repo par le contenu de repo/.git, puis indiquez au référentiel qu'il s'agit désormais d'un référentiel nu.

Pour ce faire, exécutez les commandes suivantes:

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

Notez que ceci est différent de faire un git clone --bare vers un nouvel emplacement (voir ci-dessous).

565
Jörg W Mittag

Votre méthode semble fonctionner. la structure de fichier d'un référentiel nu correspond à ce qui se trouve dans le répertoire .git. Mais je ne sais pas si l’un des fichiers est réellement modifié, donc si cela échoue, vous pouvez simplement le faire.

git clone --bare /path/to/repo

Vous aurez probablement besoin de le faire dans un répertoire différent pour éviter un conflit de noms, puis vous pourrez le déplacer à l'endroit souhaité. Et vous devrez peut-être modifier le fichier de configuration pour qu'il pointe où que se trouve votre référentiel Origin.

236
jonescb

Je pense que le lien suivant serait utile

GitFaq: Comment mettre à nu un référentiel non-nu existant?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
113
xhh

À moins que vous ne vouliez ou que vous n'ayez spécifiquement besoin de modifier un peu le système de fichiers, il est très simple de créer une version nue d'un référentiel non-nu (mentionné dans plusieurs autres articles ici). Cela fait partie de la fonctionnalité principale de git:

git clone --bare existing_repo_path bare_repo_path

66
Chip Kaye

S'il vous plaît également envisager d'utiliser

git clone --mirror path_to_source_repository

De la documentation :

Configurez un miroir du référentiel source. Cela implique --bare. Comparé à --bare, --mirror mappe non seulement les branches locales de la source sur les branches locales de la cible, il mappe également toutes les références (y compris les branches de suivi à distance, les notes, etc.) et configure une configuration refspec telle que toutes ces références. sont écrasées par une mise à jour à distance git dans le référentiel cible.

12
Jacek Krawczyk

Je voulais juste pousser vers un référentiel sur un chemin réseau, mais git ne me laissait pas faire cela à moins que ce référentiel soit marqué comme nu. Tout ce dont j'avais besoin était de changer sa configuration:

git config --bool core.bare true

Inutile de manipuler les fichiers à moins que vous ne vouliez le garder propre.

7
Slion

j'ai lu les réponses et j'ai fait ceci:

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like

cela laissera le contenu de repos/.git en tant que nu repos.git

6
Dan D.

Voici ce que je pense le plus simple et le plus sûr. Il n'y a rien ici non indiqué ci-dessus. Je veux juste voir une réponse qui montre une procédure sécurisée étape par étape. Vous démarrez un dossier à partir du référentiel (référentiel) que vous souhaitez mettre à nu. J'ai adopté la convention implicite ci-dessus selon laquelle les dossiers de référentiels nus ont une extension .git.

(1) Backup, just in case.
    (a) > mkdir backup
    (b) > cd backup
    (c) > git clone ../repo
(2) Make it bare, then move it
    (a) > cd ../repo
    (b) > git config --bool core.bare true
    (c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
    (a) > cd ..
    (b) > mkdir test
    (c) > cd test
    (d) > git clone ../repo.git
(4) Clean up
    (a) > rm -Rf repo
    (b) (optional) > rm -Rf backup/repo
    (c) (optional) > rm -Rf test/repo
4
sdesciencelover

Il suffit de lire

Pro Git Book: 4.2 Git sur le serveur - Obtenir Git sur un serveur

qui boild jusqu'à

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

Puis mettez mon_projet.git sur le serveur

Ce qui est principalement, quelle réponse # 42 a essayé de souligner. Shurely on pourrait réinventer la roue ;-)

4
apos

Voici une petite fonction BASH que vous pouvez ajouter à votre fichier .bashrc ou .profile sur un système UNIX. Une fois ajouté, le shell est redémarré ou le fichier est rechargé via un appel à source ~/.profile ou source ~/.bashrc.

function gitToBare() {
  if [ -d ".git" ]; then
    DIR="`pwd`"
    mv .git ..
    rm -fr *
    mv ../.git .
    mv .git/* .
    rmdir .git

    git config --bool core.bare true
    cd ..
    mv "${DIR}" "${DIR}.git"

    printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
    printf "bare and renamed to\n  ${DIR}.git\n"
    cd "${DIR}.git"
  else
    printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
  fi
}

Une fois appelé dans un répertoire contenant un répertoire .git, il apportera les modifications appropriées pour convertir le référentiel. S'il n'y a pas de répertoire .git présent lors de l'appel, un message FAILURE apparaît et aucun changement de système de fichiers ne se produit.

3
nyteshade

Dans le cas où vous avez un référentiel avec peu de branches/références/têtes/* localisées et peu de télécommandes de branches distantes/Origine/* ET si vous souhaitez le convertir en référentiel BARE avec toutes les branches dans/refs/heads/*

vous pouvez procéder comme suit pour enregistrer l'historique.

  1. créer un référentiel nu
  2. cd dans le référentiel local qui a des branches locales et des branches distantes
  3. git Push/chemin/à/nu/repo + réfs/télécommandes/origine/: refs/têtes /
1
Senthil A Kumar

Les méthodes qui disent de supprimer des fichiers et de déplacer le répertoire .git ne sont pas propres et n'utilisent pas la méthode "git" pour faire quelque chose qui devrait être simple. C'est la méthode la plus propre que j'ai trouvée pour convertir une prise en pension normale en une prise en pension nue.

Premier clone/chemin/vers/normal/repo dans un repo nu appelé repo.git

git clone --bare /path/to/normal/repo

Ensuite, supprimez l’origine qui pointe vers/chemin/vers/normal/repo

cd repo.git
git remote rm Origin

Enfin, vous pouvez supprimer votre dépôt initial. Vous pouvez renommer repo.git en repo à ce moment-là, mais la convention standard pour désigner un référentiel git est quelque chose de.git, donc je le laisserais personnellement ainsi.

Une fois que vous avez fait tout cela, vous pouvez cloner votre nouveau référentiel nu (ce qui crée en fait un référentiel normal et constitue également le moyen de le convertir de nu à normal).

Bien sûr, si vous avez d'autres activités en amont, vous voudrez les noter et mettre à jour votre rapport nu pour l'inclure. Mais encore une fois, tout peut être fait avec la commande git. N'oubliez pas que les pages de manuel sont votre ami.

1
krux

J'ai utilisé le script suivant pour lire un fichier texte contenant une liste de tous mes dépôts SVN et les convertir au format GIT. Plus tard, j'utilisais git clone --bare pour le convertir en dépôt brut.

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name 
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt a le format

repo1_name
repo2_name

et users.txt a le format

(no author) = Prince Rogers <[email protected]>

www-data étant l'utilisateur du serveur Web Apache, une autorisation est nécessaire pour transmettre les modifications via HTTP.

0
Pedro Vicente