2009-12-16 10 views
90

D'une façon ou d'une autre quand j'ai git init ed mon dernier projet il y a environ un mois, j'ai lancé la commande dans le répertoire un répertoire plus haut que la racine de mon projet. Par conséquent, mon référentiel se trouve dans le répertoire ./project et non dans le répertoire ./project/my-new-project. 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.Mon référentiel Git est dans le mauvais répertoire racine. Puis-je le déplacer? (../ au lieu de ./)

Existe-t-il un moyen, sans tuer mon projet, de déplacer le référentiel dans le répertoire approprié, puis 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.

Répondre

10

Probablement la chose la plus simple, sauf si vous avez déjà créé un historique que vous voulez enregistrer, serait de simplement supprimer le sous-répertoire .git et de refaire l'init dans le bon répertoire.

Si vous utilisiez git pour résoudre le problème, toute solution laisserait forcément beaucoup d'entrées d'historique "déplacées ici" qui ne sont pas réellement modifiées, mais vous corrigeriez une erreur de configuration au moment de la création. Mieux vaut juste le créer correctement.

+0

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

+2

Je vois ce que vous dites, mais toutes les actions in-git que vous faites pour corriger ceci finiront par laisser un tas de "déplacé ce fichier ici" des histoires qui ne sont pas réellement des changements, mais vous corrigeant une erreur au moment de la création. Mieux vaut juste le créer correctement. –

+6

Cela casse beaucoup de choses. http://stackoverflow.com/a/3247756/825364 est une bien meilleure façon de le faire. –

3

Utilisez git-mv pour déplacer vos fichiers "au niveau" vers le bon emplacement, puis git-rm le répertoire "my-new-project".

+0

C'est l'inverse.Je ne veux pas déplacer tous mes fichiers dans le répertoire où git est (il y a plein d'autres trucs là-bas ... ce serait ennuyeux) et ensuite déplacer git up. Je veux déplacer le dépôt vers le répertoire racine de mon projet. – Mike

33

git filter-branch vous permet de réécrire l'historique de cette manière. Le git filter-branch man page a même votre cas as an example:

Réécrire le dépôt de regarder comme si foodir/avait été la racine du projet, et jeter tous les autres l'histoire:

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

Vous voulez probablement git clone le repo dans un nouveau sous-répertoire avant (ou après?) L'exécution git filter-branch. (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 répertoire original .git/ en place en cas de problème.)

+0

A travaillé parfaitement. – lepe

+1

Cela ne "rejette pas tous les autres *** *** histoire" (suggérant que le repo '.git' reste au niveau supérieur alors que les sous-répertoires deviennent" considérés comme racine ") - cela annulera littéralement tous les autres fichiers dans le repo et déplacez tous les fichiers sous-répertoire/* vers le dossier racine. –

+0

Bonne 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 faire un 'git push --force' pour mettre à jour le dépôt en amont après cela. – waldyrious

195

J'ai eu le problème inverse Déplacez la racine git vers le répertoire parent (de projet/src à projet) A mon extrême surprise, le travail suivant a fonctionné !!

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

git intelligemment détecté que tous les nouveaux fichiers étaient des versions rebaptisées des anciens et pas d'histoire a été perdu

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

+6

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

+5

Mon cher monsieur, vous êtes un sauveur de la vie. Cette chose fonctionne vraiment. Je vous remercie. –

+1

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'aime. – ssc

2

Je suis venu ici pour trouver un moyen de déplacer mon dépôt n'importe où.

Dans le cas, je n'étais pas le seul, voici ce que je l'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 « clone git --mirror » da copie nue de ma pension et ensuite dit à ne pas être nu plus, de sorte que les fichiers sont apparus dans ce nouveau dossier. (Puis vérifié si oui ou non les fichiers et le journal étaient apparus.) J'ai gardé l'ancien repo pendant un moment, juste au cas où ...

De cette façon, je pouvais déplacer mon repo sans perdre l'historique.

salutations les meilleures, Dinah

32

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

Déplacer le dossier:

mv .git thecorrectfolder/ 

Re-initialiser le git:

cd thecorrectfolder/ 
git init 

ajouter à nouveau tous les fichiers, valider et pousser:

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

Terminé! Obtenez-vous une bière.

Lorsque vous vous engagez le git après réinitialisant, vous obtiendrez un tas de sortie qui ressemble à ceci:

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

En d'autres termes, toutes vos références du dossier parent et d'être renommé pour utiliser le bon dossier.

+0

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

+0

Cela a fonctionné pour moi, mais c'était légèrement moche. En ce qui concerne git, je n'ai rien 'bougé', j'ai simplement supprimé des centaines de fichiers puis ajouté des centaines d'autres fichiers identiques. – bjmc

+4

git init n'est pas nécessaire et la partie restante est la même que ma réponse qui a été soumise des années avant la vôtre: http://stackoverflow.com/a/3247756/391753 –

6

Git peut se rappeler les fichiers avec leurs hash,

il suffit de déplacer votre répertoire racine .git à dire et git de se rappeler tous les changements de fichiers avec l'option --all.

$ 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." 
1

Ayant tout juste passé par ce même problème que ma solution finale était:

  1. Déplacer le dossier .git là où il devait être.
  2. Changer de répertoire dans le dossier que je viens .git déplacé à
  3. Réinitialiser 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'ils devraient être avec kdiff3 ou d'une autre comparer outil
  5. Supprimez les fichiers non-versionnés de l'ancien emplacement.

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

-2

Il y a deux façons ici:

  1. cd TheWrongDirectory rm -rf .git

  2. Il suffit de supprimer le dossier .git et cd dans le bon répertoire.

Questions connexes