Comment déplacer un référentiel git dans un autre répertoire et faire de ce répertoire un référentiel git?

101

J'ai un répertoire gitrepo1 . Ce répertoire est un référentiel git.

  • Je voudrais déplacer ce gitrepo1 dans un autre répertoire newrepo .

  • Le répertoire newrepo doit être le nouveau référentiel git sans perte d'historique git et doit contenir le répertoire gitrepo1 .

  • Le répertoire gitrepo1 devrait être juste un répertoire maintenant (dans newrepo ), sans aucun .gitindex, c'est-à-dire qu'il ne devrait plus être un dépôt git indépendant ou un sous-module.

Comment puis-je faire ceci?

Pranjal Mittal
la source
9
mv girepo1 newrepo??
ddavison

Réponses:

109

C'est très simple. Git ne se soucie pas du nom de son répertoire. Il ne se soucie que de ce qu'il y a à l'intérieur. Vous pouvez donc simplement faire:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Notez que la copie est assez chère si le référentiel est volumineux et avec une longue histoire. Vous pouvez également l'éviter facilement:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Une fois que vous avez créé newrepo, la destination à mettre gitrepo1pourrait être n'importe où, même à l'intérieur newreposi vous le souhaitez. Cela ne change pas la procédure, juste le chemin que vous écrivez gitrepo1.

Shahbaz
la source
6
+1. Cela vaut probablement la peine de mentionner ce problème affectant les dépôts créés avec la version git 1.7.8 ou 1.7.9 - ce qui peut signifier que déplacer un dépôt git le rend inutilisable (bien que, comme indiqué, il soit facilement corrigé).
AD7six
1
je suis sur la machine wndows et en utilisant l'invite de commande. je n'ai pas pu trouver la commande "cp". La commande "cp" est-elle spécifique à un autre système d'exploitation?
LP13 du
1
@ user3862378,, cpcomme presque toutes les commandes ou fonctions sont spécifiques à d'autres systèmes d'exploitation. En fait, il est spécifique à chaque système d'exploitation qui n'est pas Windows. Essayez d'appeler Microsoft et demandez-leur pourquoi ils ne sont pas POSIX. Quoi qu'il en soit, cpsignifie copie. mvsignifie bouger. rmsignifie supprimer. Vous pouvez trouver des équivalents Windows.
Shahbaz
@Shahbaz Merci, la solution ci-dessus crée la structure suivante "newrepo ->. Git" et "newrepo-> tous les autres fichiers de gitrepo1" ... il ne met pas le dossier "gitrepo1" dans "newrepo" .. je suis curieux de savoir si créer des dossiers manuellement dans Windows et déplacer le dossier ".git" sous le dossier racine .. fonctionnerait sans affecter l'historique?
LP13 du
2
@ user3862378, il n'y a aucune raison pour que ce ne soit pas le cas. .git/contient tout l'historique, qui comprend votre dernier commit. Où que vous le mettiez, vous avez toute l'histoire. En fait, si tous les fichiers de ce répertoire sont différents du dépôt d'origine d'où vous avez pris .git/, la seule chose serait que cela vous indique que certains fichiers sont supprimés et que certains non suivis sont présents. Avec un git reset --hard, les fichiers supprimés seraient récupérés automatiquement! La seule chose à noter est qu'en copiant simplement, .git/vous ne pouvez pas récupérer les modifications non validées.
Shahbaz
4

Il est un peu tard et la question est déjà répondue mais, pour le faire sans aucun mal de tête:

  1. Découvrez quelle est la branche actuelle dans laquelle vous vous trouvez dans l'ancien dossier git avec git status, disons le développement de branche
  2. Changez de répertoire vers le nouveau dossier git, puis git clonele projet du repo vers le nouveau dossier
  3. Récupérez la branche actuelle dans votre nouveau dossier: git checkout development
  4. Syncronisez votre nouveau dossier avec l'ancien, en utilisant rsync, à l' exclusion du dossier .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Ensuite, vous êtes prêt à continuer là où vous vous êtes arrêté

emremrah
la source
1

C'est encore plus simple que ça. Je viens de faire ceci (sous Windows, mais cela devrait fonctionner sur un autre système d'exploitation):

  1. Créez newrepo .
  2. Déplacez gitrepo1 dans newrepo .
  3. Déplacez .git de gitrepo1 vers newrepo (niveau supérieur).
  4. Validez les modifications (corrigez le suivi si nécessaire).

Git voit juste que vous avez ajouté un répertoire et renommé un tas de fichiers. Pas de problème.

david.pfx
la source
1

Je ne suis pas un expert, mais je copie le dossier .git dans un nouveau dossier, puis j'appelle: git reset --HARD

Redémarrez l'univers
la source