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.
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).
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.
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
À 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
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.
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.
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
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
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 ;-)
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.
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.
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.
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.