Mon dépôt Git est dans le mauvais répertoire racine. Puis-je le déplacer? (../ au lieu de ./)

118

D'une manière ou d'une autre, quand j'ai git initédité mon dernier projet il y a environ un mois, j'ai exécuté la commande dans le répertoire un répertoire plus haut que la racine de mon projet.

Donc, mon référentiel est dans le ./projectrépertoire et non dans le ./project/my-new-projectrépertoire. Je ne sais pas comment je n'ai pas réalisé le problème plus tôt, mais je n'ai simplement jamais cherché le répertoire .git jusqu'à présent.

Existe-t-il un moyen, sans tuer mon projet, de déplacer le référentiel vers le bon répertoire et de dire à git quelle est la nouvelle base du projet? Le simple déplacement du répertoire ne fonctionne pas. Git pense que tous les fichiers ont été supprimés.

Mike
la source

Réponses:

19

La chose la plus simple, à moins que vous n'ayez déjà créé un historique que vous souhaitez enregistrer, serait de simplement supprimer le .gitsous - répertoire et de refaire l'initialisation dans le bon répertoire.

Si vous utilisiez git pour résoudre le problème, toute solution laisserait nécessairement derrière elle beaucoup d'entrées d'historique "déplacé ce fichier ici" qui ne sont pas réellement des changements, mais vous corrigez un problème au moment de la création. Mieux vaut simplement le créer correctement.

TED
la source
2
Je vois ce que vous dites, mais toute action in-git que vous faites pour corriger cela finira par laisser un tas d'histoires "déplacé ce fichier ici" qui ne sont pas réellement des changements, mais vous corrigez un problème au moment de la création. Mieux vaut simplement le créer correctement.
TED
8
Cela casse beaucoup de choses. stackoverflow.com/a/3247756/825364 est une bien meilleure façon de le faire.
Steve Tauber
2
Eh bien, Git est utilisé pour sauvegarder un peu d'histoire. Peut-être devrions-nous simplement supprimer le sous-répertoire .git et désinstaller Git de notre système? Utiliser un serveur ftp au lieu de vcs est probablement la chose la plus simple après tout!
Gherman
2
la réponse ci-dessous est une bien meilleure approche car elle conserve toute l'histoire
BigMikeW
2
Donc pour moi, j'ai fait ça et j'ai immédiatement réalisé mon erreur. sans avoir à vous soucier de changements, c'est le moyen le plus simple de revenir à une table rase.
Mike
261

J'ai eu le problème inverse - j'ai dû déplacer la racine git vers le répertoire parent (du projet / src au projet) À ma grande surprise, ce qui suit a fonctionné !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git a intelligemment détecté que tous les nouveaux fichiers étaient des versions renommées des anciens et qu'aucun historique n'a été perdu

Vous pouvez essayer quelque chose de similaire ... déplacez le dossier .git et ajoutez à nouveau les fichiers avant de valider

Abhishek Anand
la source
8
Cela a parfaitement fonctionné pour moi. J'ai également déplacé d'autres fichiers de configuration .git * du répertoire comme .gitigore
Relequestual
7
Mon cher monsieur, vous êtes un sauveur de vie. Cette chose fonctionne vraiment. Je vous remercie.
Radu Murzea
1
De plus, j'ai git rm'dles fichiers de leur ancien emplacement, donc git status(correctement) fini par rapporter un certain nombre d'opérations de changement de nom. Plus je travaille avec git, plus je l'aime.
ssc
7
@Mike cela devrait être marqué comme la réponse acceptée. C'est une solution préférée pour la réinitialisation car vous ne perdez pas d'histoire. Si vous ne me croyez pas, le nombre de votes positifs parle de lui-même.
Joseph Spens
3
Je vous remercie! Cela a fonctionné pour moi, mais j'ai dû faire quelques autres choses: 1. Avant de commettre, j'ai mis à jour .gitignoreet exécuté git add -Adans le dossier racine; après cela, git a correctement montré tous les fichiers renamedplutôt que deleted. 2. Puisque j'utilise des sous-modules, j'ai dû passer .gitmodulesà la nouvelle racine et mettre à jour le chemin du sous-module dans les différents fichiers de configuration de git. Pour trouver les fichiers à modifier, j'ai courugrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari
43

Cela a fonctionné pour moi et a gardé toute mon histoire intacte. À partir du dossier racine incorrect (le parent où vous avez accidentellement initialisé le dépôt):

Déplacez le dossier:

mv .git thecorrectfolder/

Réinitialisez le dépôt git:

cd thecorrectfolder/
git init

Ajoutez à nouveau tous les fichiers, validez et envoyez:

git add .
git commit -am 'fixing things'
git push origin master

Terminé! Procurez-vous une bière.

Lorsque vous validez le dépôt git après la réinitialisation, vous obtiendrez un tas de résultats qui ressemblent à ceci:

rename {ethanode/coffee => coffee}/app.coffee (100%)

En d'autres termes, toutes vos références du dossier parent et en cours de renommée pour utiliser le dossier correct.

holmesal
la source
Merci! Cette méthode était exactement ce dont j'avais besoin!
Giel Berkers
Cela a fonctionné pour moi, mais c'était légèrement moche. En ce qui concerne git, je n'ai rien «déplacé», j'ai simplement supprimé des centaines de fichiers puis ajouté des centaines d'autres fichiers identiques.
bjmc
6
git init n'est pas obligatoire et la partie restante est la même que ma réponse qui a été soumise des années avant la vôtre: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchvous permet de réécrire l'histoire de cette manière. La git filter-branchpage de manuel a même votre cas comme exemple :

Pour réécrire le référentiel pour donner l'impression que foodir / avait été la racine de son projet et supprimer toute autre histoire:

git filter-branch --subdirectory-filter foodir -- --all

Vous souhaitez probablement git cloneplacer le dépôt dans un nouveau sous-répertoire avant (ou après?) L' git filter-branchexécution. (Le clonage avant la branche de filtre et l'exécution de la branche de filtre sur le nouveau clone auraient l'avantage de laisser le .git/répertoire d' origine en place comme sauvegarde en cas de problème.)

ndim
la source
1
Cela ne «supprime pas tous les autres historiques » (suggérant que le .gitdépôt reste au niveau supérieur tandis que les sous-répertoires deviennent «considérés comme la racine») - cela supprimera littéralement tous les autres fichiers du dépôt et déplacera tous les subdirectory/*fichiers vers le dossier racine .
Louis Maddox
Excellente réponse, mais gardez à l'esprit que s'il y a un fichier .gitignore (s'il est suivi), il sera perdu avec cette opération. De plus, vous devrez effectuer une git push --forcemise à jour du référentiel en amont après cela.
waldyrious
12

Git peut se souvenir des fichiers avec leurs hachages,

Déplacez simplement votre .gitrépertoire racine et dites gitde vous souvenir de tous les changements de fichiers avec l' --alloption.

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."
M. Reza Nasirloo
la source
3

Utilisez git-mvpour déplacer vos fichiers "vers le haut" vers l'emplacement approprié, puis git-rmle répertoire "mon-nouveau-projet".

jkndrkn
la source
C'est l'inverse. Je ne veux pas déplacer tous mes fichiers vers le répertoire dans lequel se trouve git (il y a des tonnes d'autres choses là-bas ... ce serait ennuyeux) puis déplacer git vers le haut. Je souhaite déplacer le référentiel vers le répertoire racine de mon projet.
Mike
2

Je suis venu ici à la recherche d'un moyen de déplacer mon référentiel n'importe où .

Au cas où, je n'étais pas le seul, voici ce que j'ai fait à la fin:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F I « git clone --mirror » da copie nue de ma pension et il dit plus tard de ne pas être plus nu, de sorte que les fichiers montrais up dans ce nouveau dossier. (Ensuite, j'ai vérifié si les fichiers et le journal étaient apparus ou non.) J'ai gardé l'ancien dépôt pendant un moment, juste au cas où ...

De cette façon, j'ai pu déplacer mon repo sans perdre l'historique.

Meilleures salutations, Dinah

user1565849
la source
Corrigez-moi si je me trompe, mais il semble que vous auriez pu y parvenir en déplaçant simplement le répertoire du référentiel à sa position désignée en utilisant uniquement des outils de système de fichiers nus, comme mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee le
2

Après avoir traversé ce même problème, ma solution finale était:

  1. Déplacez le dossier .git là où il devait être.
  2. Remplacez le répertoire par le dossier dans lequel je viens de déplacer .git
  3. Réinitialisez le contenu du dossier à ce que git pense qu'il devrait être: git reset --hard HEAD
  4. Vérifiez que le contenu correspond à ce qu'il devrait être avec kdiff3 ou un autre outil de comparaison
  5. Supprimez les fichiers désormais non versionnés à l'ancien emplacement.

Cela a fonctionné comme par magie sans aucun impact sur l'histoire. - NB Si vous avez apporté des modifications, assurez-vous de les valider avant le déplacement du répertoire .git.

Steve Barnes
la source
-3

Il y a deux façons ici:

  1. cd TheWrongDirectory rm -rf .git

  2. SUPPRIMEZ simplement le dossier .git et le cd dans le bon répertoire.

V. Rance
la source