Mein Git-Repository befindet sich im falschen Stammverzeichnis. Kann ich es bewegen? (../ anstatt ./)

118

Als ich vor git initungefähr einem Monat mein letztes Projekt bearbeitet habe, habe ich den Befehl in dem Verzeichnis ausgeführt, das ein Verzeichnis höher als das Stammverzeichnis meines Projekts ist.

Mein Repository befindet sich also im ./projectVerzeichnis und nicht im ./project/my-new-projectVerzeichnis. Ich weiß nicht, wie ich das Problem früher nicht erkannt habe, aber ich habe bis jetzt nie nach dem .git-Verzeichnis gesucht.

Gibt es eine Möglichkeit, ohne mein Projekt zu beenden, das Repository in das richtige Verzeichnis zu verschieben und git dann mitzuteilen, was die neue Basis des Projekts ist? Nur das Verzeichnis zu verschieben funktioniert nicht. Git glaubt, dass alle Dateien gelöscht wurden.

Mike
quelle

Antworten:

19

Am einfachsten ist es wahrscheinlich, wenn Sie nicht bereits einen Verlauf erstellt haben, den Sie speichern möchten, einfach das .gitUnterverzeichnis zu löschen und den Init im richtigen Verzeichnis zu wiederholen.

Wenn Sie git verwendet haben, um das Problem zu lösen, würde jede Lösung notwendigerweise viele Verlaufseinträge "Diese Datei hierher verschoben" hinterlassen, die sich nicht wirklich ändern, aber Sie beheben einen Fehler beim Erstellen. Besser einfach richtig machen.

TED
quelle
2
Ich verstehe, was Sie sagen, aber alle In-Git-Aktionen, die Sie ausführen, um dies zu korrigieren, hinterlassen eine Reihe von "Diese Datei hierher verschoben" -Historien, die sich nicht wirklich ändern, aber Sie beheben einen Fehler beim Erstellen. Besser einfach richtig machen.
TED
8
Das bricht eine Menge Sachen. stackoverflow.com/a/3247756/825364 ist ein viel besserer Weg, dies zu tun.
Steve Tauber
2
Nun, Git wird gespeichert, um etwas Geschichte zu speichern. Vielleicht sollten wir einfach das Unterverzeichnis .git löschen und Git von unserem System deinstallieren? Die Verwendung eines FTP-Servers anstelle von VCS ist wahrscheinlich doch die einfachste Sache!
Gherman
2
Die Antwort unten ist ein viel besserer Ansatz, da sie die gesamte Geschichte beibehält
BigMikeW
2
Also tat ich das und erkannte sofort meinen Fehler. Dies ist der einfachste Weg, um zu einem sauberen Schiefer zurückzukehren, ohne dass Sie sich Sorgen machen müssen.
Mike
261

Ich hatte das gegenteilige Problem - musste das Git-Stammverzeichnis in das übergeordnete Verzeichnis verschieben (von project / src zu project). Zu meiner großen Überraschung funktionierte Folgendes !!

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

Git erkannte geschickt, dass alle neuen Dateien in alte Versionen umbenannt wurden und kein Verlauf verloren ging

Sie können etwas Ähnliches versuchen ... Verschieben Sie den Ordner .git und fügen Sie die Dateien erneut hinzu, bevor Sie sie festschreiben

Abhishek Anand
quelle
8
Das hat bei mir perfekt funktioniert. Ich habe auch andere .git * Konfigurationsdateien aus dem Verzeichnis wie .gitigore
Relequestual
7
Sehr geehrter Herr, Sie sind ein Lebensretter. Dieses Ding funktioniert wirklich. Danke dir.
Radu Murzea
1
Außerdem habe ich git rm'ddie Dateien von ihrem alten Speicherort, so dass git status(korrekt) eine Reihe von Umbenennungsvorgängen gemeldet wurden. Je mehr ich mit Git arbeite, desto mehr gefällt es mir.
SSC
7
@Mike dies sollte als akzeptierte Antwort markiert werden. Dies ist eine bevorzugte Lösung für die erneute Initiierung, da Sie den Verlauf nicht verlieren. Wenn Sie mir nicht glauben, spricht die Anzahl der Stimmen für sich.
Joseph Spens
3
Danke dir! Es hat bei mir funktioniert, aber ich musste noch ein paar Dinge tun: 1. Vor dem Festschreiben habe ich den Stammordner aktualisiert .gitignoreund ausgeführt git add -A. Danach zeigte git alle Dateien korrekt als renamedstatt deleted. 2. Da ich Submodule verwende, musste ich zum .gitmodulesneuen Stammverzeichnis wechseln und den Submodulpfad in den verschiedenen Git-Konfigurationsdateien aktualisieren. Um herauszufinden, welche Dateien geändert werden müssen, lief ichgrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari
43

Dies funktionierte für mich und hielt meine gesamte Geschichte intakt. Aus dem falschen Stammordner (dem übergeordneten Ordner, in dem Sie das Repo versehentlich initialisiert haben):

Verschieben Sie den Ordner:

mv .git thecorrectfolder/

Initialisieren Sie das Git-Repo neu:

cd thecorrectfolder/
git init

Fügen Sie alle Dateien erneut hinzu, schreiben Sie sie fest und drücken Sie:

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

Getan! Hol dir ein Bier.

Wenn Sie das Git-Repo nach der Neuinitialisierung festschreiben, erhalten Sie eine Reihe von Ausgaben, die folgendermaßen aussehen:

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

Mit anderen Worten, alle Ihre Referenzen stammen aus dem übergeordneten Ordner und werden umbenannt, um den richtigen Ordner zu verwenden.

holmesal
quelle
Vielen Dank! Diese Methode war genau das, was ich brauchte!
Giel Berkers
Das hat bei mir funktioniert, war aber etwas hässlich. Was Git betrifft, habe ich nichts 'verschoben', sondern nur Hunderte von Dateien gelöscht und dann Hunderte anderer, identischer Dateien hinzugefügt.
bjmc
6
Git Init ist nicht erforderlich und der verbleibende Teil entspricht meiner Antwort, die Jahre vor Ihrer eingereicht wurde: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchAuf diese Weise können Sie den Verlauf neu schreiben. Die git filter-branchManpage hat sogar Ihren Fall als Beispiel :

So schreiben Sie das Repository so um, dass es so aussieht, als ob foodir / seine Projektwurzel gewesen wäre, und verwerfen alle anderen Verlaufsdaten:

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

Sie möchten git clonedas Repo wahrscheinlich vor (oder nach?) Dem git filter-branchLauf in ein neues Unterverzeichnis verschieben . (Das Klonen vor dem Filterzweig und das Ausführen des Filterzweigs auf dem neuen Klon hätte den Vorteil, dass das ursprüngliche .git/Verzeichnis als Backup beibehalten wird, falls etwas schief geht.)

ndim
quelle
1
Dies "verwirft nicht alle anderen Historien " (was darauf hindeutet, dass das .gitRepo auf der obersten Ebene bleibt, während Unterverzeichnisse als "Root" betrachtet werden) - dies verwirft buchstäblich alle anderen Dateien im Repo und verschiebt alle subdirectory/*Dateien in den Root-Ordner .
Louis Maddox
Gute Antwort, aber denken Sie daran, dass eine .gitignore-Datei (falls verfolgt) bei diesem Vorgang verloren geht. Außerdem müssen Sie a ausführen git push --force, um das Upstream-Repository danach zu aktualisieren.
Waldyrious
12

Git kann sich Dateien mit ihren Hashes merken,

Verschieben Sie einfach Ihr .gitVerzeichnis in das Stammverzeichnis und teilen Sie gituns mit, dass alle Dateiänderungen mit --allOption gespeichert werden sollen .

$ 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
quelle
3

Verwenden git-mvSie diese Option , um Ihre Dateien "nach oben" an den richtigen Speicherort und dann in git-rmdas Verzeichnis "Mein neues Projekt" zu verschieben.

jkndrkn
quelle
Es ist anders herum. Ich möchte nicht alle meine Dateien in das Verzeichnis verschieben, in dem sich git befindet (es gibt Unmengen anderer Dinge dort ... es wäre ärgerlich) und dann git nach oben verschieben. Ich möchte das Repository in das Stammverzeichnis meines Projekts verschieben.
Mike
2

Ich bin hierher gekommen, um nach einer Möglichkeit zu suchen, mein Repository irgendwohin zu verschieben .

Für den Fall, dass ich nicht der einzige war, habe ich am Ende Folgendes getan:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Ich "git clone --mirror" da nackte Kopie meines Repos und sagte danach, dass es nicht mehr nackt sein soll, also wurden die Dateien angezeigt in diesem neuen Ordner. (Dann wurde überprüft, ob Dateien und Protokolle angezeigt wurden oder nicht.) Das alte Repo wurde eine Weile beibehalten, nur für den Fall ...

Auf diese Weise konnte ich mein Repo verschieben, ohne die Geschichte zu verlieren.

Beste Grüße, Dinah

user1565849
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, dass Sie dies erreicht haben könnten, indem Sie das Repository-Verzeichnis einfach mit bloßen Dateisystem-Tools wie z mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
Cueedee
2

Nachdem ich gerade dasselbe Problem durchlaufen hatte, war meine mögliche Lösung:

  1. Verschieben Sie den .git-Ordner an den gewünschten Ort.
  2. Wechseln Sie in den Ordner, in den ich gerade verschoben habe .git
  3. Setzen Sie den Inhalt des Ordners auf das zurück, was Git für richtig hält: git reset --hard HEAD
  4. Überprüfen Sie, ob der Inhalt mit kdiff3 oder einem anderen Vergleichstool übereinstimmt
  5. Löschen Sie die jetzt nicht versionierten Dateien am alten Speicherort.

Es funktionierte wie Magie ohne Einfluss auf die Geschichte. - NB Wenn Sie einige Änderungen vorgenommen haben, müssen Sie diese vor dem Verschieben des .git-Verzeichnisses festschreiben.

Steve Barnes
quelle
-3

Hier gibt es zwei Möglichkeiten:

  1. cd TheWrongDirectory rm -rf .git

  2. LÖSCHEN Sie einfach den .git-Ordner und die CD in das richtige Verzeichnis.

V. Rance
quelle