148 votes

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

D'une certaine manière, quand je git init Pour mon dernier projet, il y a environ un mois, j'ai lancé la commande dans le répertoire situé un répertoire plus haut que la racine de mon projet.

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

Y a-t-il un moyen, sans tuer mon projet, de déplacer le dépôt dans le bon répertoire et de dire à git quelle est la nouvelle base du projet ? Déplacer simplement le répertoire ne fonctionne pas. Git pense que tous les fichiers ont été supprimés.

291voto

Abhishek Points 910

J'ai eu le problème inverse - j'ai dû déplacer le Root git dans le répertoire parent (de project/src à project). A mon extrême 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 d'anciens fichiers et qu'aucun historique n'a été perdu.

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

8 votes

Cela a parfaitement fonctionné pour moi. J'ai également déplacé d'autres fichiers de configuration .git* du répertoire comme .gitigore.

8 votes

Mon cher monsieur, vous êtes un sauveur de vie. Ce truc marche vraiment. Je vous remercie.

1 votes

En outre, je git rm'd les fichiers de leur ancien emplacement, donc git status (correctement) a fini par rapporter un certain nombre d'opérations de renommage. Plus je travaille avec git, plus je l'apprécie.

47voto

holmesal Points 87

Cela a fonctionné pour moi, et a gardé toute mon histoire intacte. Depuis le dossier racine incorrect (le parent où vous avez accidentellement initialisé le repo) :

Déplacez le dossier :

mv .git thecorrectfolder/

Réinitialiser le repo git :

cd thecorrectfolder/
git init

Ajoutez à nouveau tous les fichiers, faites un commit, et poussez :

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

C'est fait ! Va te chercher une bière.

Lorsque vous livrez le dépôt git après la réinitialisation, vous obtiendrez une série 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 sont renommées pour utiliser le bon dossier.

0 votes

Merci ! Cette méthode était exactement ce dont j'avais besoin !

0 votes

Cela a fonctionné pour moi, mais c'était légèrement laid. En ce qui concerne git, je n'ai rien " déplacé ", j'ai juste supprimé des centaines de fichiers et ajouté des centaines d'autres fichiers identiques.

8 votes

Git init n'est pas nécessaire et le reste est identique à ma réponse qui a été soumise des années avant la vôtre : stackoverflow.com/a/3247756/391753

34voto

ndim Points 11557

git filter-branch vous permet de réécrire l'histoire de cette façon. Le site git filter-branch page de manuel même a votre cas à titre d'exemple :

Pour réécrire le dépôt pour qu'il ait l'air d'avoir été le projet Root de foodir/, et supprimer tout autre historique :

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

Vous voulez probablement git clone le repo dans un nouveau sous-répertoire avant (ou après ?) le git filter-branch courir. (Le fait de cloner avant la branche de filtrage et d'exécuter la branche de filtrage sur le nouveau clone aurait l'avantage de laisser la branche de filtrage originale en place. .git/ dir en place comme sauvegarde en cas de problème).

1 votes

Cela ne veut pas dire "écarter toutes les autres histoire " (suggérant que le .git reste au niveau supérieur tandis que les sous-répertoires sont "considérés comme la racine") - cela éliminera littéralement tous les autres fichiers du dépôt, et déplacera tous les fichiers de l'arborescence du dépôt. subdirectory/* jusqu'au dossier racine.

0 votes

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. Aussi, vous aurez besoin de faire un git push --force pour mettre à jour le dépôt amont après cela.

26voto

T.E.D. Points 26829

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

Si vous utilisiez git pour résoudre le problème, toute solution laisserait nécessairement derrière elle un grand nombre d'entrées d'historique "déplacé ce fichier ici" qui ne sont pas réellement des changements, mais la réparation d'une erreur au moment de la création. Il est préférable de le créer correctement.

0 votes

Oui, c'est ce que je pense. Ce ne serait pas une grande perte de perdre cette histoire, mais ce serait bien de ne pas la perdre si la réparation était relativement facile.

2 votes

Je vois ce que vous dites, mais toutes les actions in-git que vous faites pour corriger cela finiront par laisser un tas d'histoires "déplacé ce fichier ici" qui ne sont pas vraiment des changements, mais vous corrigez une erreur au moment de la création. Il est préférable de le créer correctement.

8 votes

Ça casse beaucoup de choses. stackoverflow.com/a/3247756/825364 est un bien meilleur moyen de le faire.

3voto

jkndrkn Points 2211

Utilisez git-mv pour déplacer vos fichiers "en haut" vers le bon endroit, puis git-rm le répertoire "mon-nouveau-projet".

0 votes

C'est l'inverse. Je ne veux pas déplacer tous mes fichiers vers le bas dans le répertoire où se trouve git (il y a des tonnes d'autres choses là... ce serait ennuyeux) et ensuite déplacer git vers le haut. Je veux déplacer le référentiel vers le haut, dans le répertoire racine de mon projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X