Comment puis-je convertir un dépôt Git «normal» en un dépôt nu?
La principale différence semble être:
dans le référentiel Git normal, vous avez un
.git
dossier à l'intérieur du référentiel contenant toutes les données pertinentes et tous les autres fichiers constituant votre copie de travaildans 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
mv repo/.git repo.git; rm -rf repo
&&
au lieu de;
en cas d'mv
échec!Réponses:
En bref: remplacez le contenu de
repo
par le contenu derepo/.git
, puis dites au référentiel qu'il s'agit désormais d'un référentiel nu.Pour ce faire, exécutez les commandes suivantes:
Notez que cela est différent de faire un
git clone --bare
vers un nouvel emplacement (voir ci-dessous).la source
core.bare
. Maintenant, après avoir googlé cette option, je peux la confirmer: kernel.org/pub/software/scm/git-core/docs/git-config.htmlgit clone --bare /path/to/repo
).rm
commande peut avoir besoin* \.[!.]*
plutôt que*
pour supprimer des fichiers dot et des répertoires dot.Votre méthode semble fonctionner; la structure de fichiers d'un référentiel nu est exactement 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 faire
Vous devrez probablement le faire dans un répertoire différent pour éviter un conflit de nom, puis vous pouvez simplement le déplacer là où vous le souhaitez. Et vous devrez peut-être modifier le fichier de configuration pour pointer vers l'emplacement de votre dépôt d'origine.
la source
git clone --bare /path/to/repo.git /path/to/newbarerepo.git
git update-server-info
le référentiel nu après la création.Je pense que le lien suivant serait utile
GitFaq: Comment rendre nu un référentiel non-nu existant?
la source
git clone
) présente les inconvénients que nosatalian a mentionnés ci-dessus.À moins que vous ne vouliez ou n'ayez spécifiquement besoin de tordre des bits sur le système de fichiers, il est vraiment simple de créer une version nue d'un référentiel non nu (mentionné dans plusieurs autres articles ici). Cela fait partie des fonctionnalités de base de git:
git clone --bare existing_repo_path bare_repo_path
la source
Veuillez également envisager d'utiliser
De la documentation :
la source
clone
). Suis-je en train de manquer quelque chose? C'était--mirror
un ajout relativement récent?--mirror
est disponible à partir de la version 1.7, donc déjà assez long. Vous pouvez vérifier iciJe voulais juste pousser vers un référentiel sur un chemin réseau, mais git ne me le permettrait pas à moins que ce référentiel ne soit marqué comme nu. Tout ce dont j'avais besoin était de changer sa configuration:
Pas besoin de jouer avec les fichiers, sauf si vous voulez les garder propres.
la source
j'ai lu les réponses et je l'ai fait:
cela laissera le contenu
repos/.git
comme à nurepos.git
la source
Voici ce que je pense être le plus sûr et le plus simple. Il n'y a rien ici non indiqué ci-dessus. Je veux juste voir une réponse qui montre une procédure étape par étape sûre. Vous démarrez un dossier à partir du référentiel (repo) que vous souhaitez mettre à nu. J'ai adopté la convention impliquée ci-dessus selon laquelle les dossiers de référentiel nus ont une extension .git.
la source
Lisez simplement
Pro Git Book: 4.2 Git sur le serveur - Obtenir Git sur un serveur
qui se résument à
Ensuite, placez my_project.git sur le serveur
Ce qui est principalement, quelle réponse # 42 a essayé de souligner. On pourrait à coup sûr réinventer la roue ;-)
la source
Voici une petite fonction BASH que vous pouvez ajouter à votre .bashrc ou .profile sur un système UNIX. Une fois ajouté et le shell est redémarré ou le fichier est rechargé via un appel à
source ~/.profile
ousource ~/.bashrc
.Une fois appelé dans un répertoire contenant un répertoire .git, il apportera les modifications appropriées pour convertir le référentiel. Si aucun répertoire .git n'est présent lors de l'appel, un message FAILURE apparaîtra et aucune modification du système de fichiers ne se produira.
la source
Les méthodes qui disent de supprimer des fichiers et de bouger avec le déplacement du 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 un dépôt normal en un dépôt nu.
Premier clone / chemin / vers / normal / repo dans un référentiel nu appelé repo.git
Supprimez ensuite l'origine qui pointe vers / chemin / vers / normal / repo
Enfin, vous pouvez supprimer votre dépôt d'origine. Vous pouvez renommer repo.git en repo à ce stade, mais la convention standard pour signifier un référentiel git est quelque chose.git, donc je le laisserais personnellement de cette façon.
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 est également la façon dont vous le convertiriez de nu en normal)
Bien sûr, si vous avez d'autres amonts, vous voudrez en prendre note et mettre à jour votre référentiel nu pour l'inclure. Mais encore une fois, tout cela peut être fait avec la commande git. N'oubliez pas que les pages de manuel sont votre ami.
la source
.git
dossier. C'est très instructif d'apprendre, comment les pièces s'assemblent.Dans le cas où vous avez un référentiel avec quelques branches / références / têtes / * locales et quelques branches distantes distantes / origine / * ET si vous voulez le convertir en un référentiel BARE avec toutes les branches dans / refs / têtes / *
vous pouvez effectuer les opérations suivantes pour enregistrer l'historique.
la source
J'ai utilisé le script suivant pour lire un fichier texte qui contient une liste de tous mes dépôts SVN et les convertir en GIT, puis utiliser git clone --bare pour convertir en un dépôt git nu
list.txt a le format
et users.txt a le format
www-data est l'utilisateur du serveur Web Apache, une autorisation est nécessaire pour pousser les modifications via HTTP
la source
Voici la définition d'un dépôt nu de gitglossary :
Je suis arrivé ici parce que je jouais avec un "dépôt local" et je voulais pouvoir faire ce que je voulais comme s'il s'agissait d'un dépôt distant. Je jouais juste, essayant d'en apprendre plus sur Git. Je suppose que c'est la situation pour quiconque veut lire cette réponse.
J'aimerais d'avis d'experts ou des contre-exemples, mais il semble que (après en fouillant dans un code source git que j'ai trouvé) tout simplement aller au fichier spécifique
.git/config
et le réglage du noyau attribut nu à vrai , git vous permettra de faire tout que vous souhaitez effectuer à distance sur le référentiel. C'est-à-dire que les lignes suivantes doivent exister dans.git/config
:(C'est à peu près ce que
git config --bool core.bare true
fera la commande , ce qui est probablement recommandé pour faire face à des situations plus compliquées)Ma justification de cette affirmation est que, dans le code source de git, il semble y avoir deux façons différentes de tester si un dépôt est nu ou non. L'une consiste à vérifier une variable globale
is_bare_repository_cfg
. Ce paramètre est défini lors d'une phase de configuration de l'exécution et reflète la valeur trouvée dans le.git/config
fichier. L'autre est une fonctionis_bare_repository()
. Voici la définition de cette fonction:Je n'ai pas le temps ni l'expertise pour le dire avec une confiance absolue, mais pour autant que je sache si vous avez
bare
défini l' attributtrue
dans.git/config
, cela devrait toujours revenir1
. Le reste de la fonction concerne probablement la situation suivante:Je l'expérimenterai quand je le pourrai plus tard, mais cela semblerait indiquer que la définition de core.bare = true équivaut à supprimer core.bare du fichier de configuration et à configurer correctement les répertoires.
Quoi qu'il en soit, la définition de core.bare = true vous permettra certainement de pousser, mais je ne suis pas sûr si la présence de fichiers de projet entraînera le dysfonctionnement d'autres opérations. C'est intéressant et je suppose instructif de pousser vers le référentiel et de voir ce qui s'est passé localement (c'est-à-dire exécuter
git status
et donner un sens aux résultats).la source
Tout d'abord,
backup
votre référentiel existant:Ensuite, exécutez ce qui suit:
la source
Oneliner pour effectuer toutes les opérations ci-dessus:
(ne me blâmez pas si quelque chose explose et que vous n'avez pas eu de sauvegarde: P)
la source
Wow, c'est tout simplement incroyable de voir combien de personnes sont intervenues à ce sujet, d'autant plus qu'il ne semble pas qu'un seul s'est arrêté pour demander pourquoi cette personne fait ce qu'il fait.
La SEULE différence entre un dépôt git nu et non nu est que la version non nue a une copie de travail. La principale raison pour laquelle vous auriez besoin d'un dépôt nu est que si vous vouliez le mettre à la disposition d'un tiers, vous ne pouvez pas réellement y travailler directement, donc à un moment donné, vous devrez le cloner à quel moment vous êtes de retour à une version de travail régulière.
Cela étant dit, pour se convertir à un repo nu, tout ce que vous avez à faire est de vous assurer que vous n'avez aucun commit en attente, puis juste:
Voilà, repo nu.
la source
git config core.bare true
de même.git config core.bare true
, tout comme dans cette réponse .