822 Stimmen

Ist es möglich, Dateien in Git zu verschieben/umzubenennen und ihren Verlauf beizubehalten?

Ich möchte einen Projektunterbaum in Git umbenennen/verschieben, indem ich ihn von

/project/xyz

zu

/components/xyz

Wenn ich eine einfache git mv project components dann wird die gesamte Commit-Historie für die xyz project verloren geht. Gibt es eine Möglichkeit, dies so zu verschieben, dass die Historie erhalten bleibt?

14 Stimmen

5 Stimmen

Ich möchte nur anmerken, dass ich gerade das Verschieben von Dateien über das Dateisystem getestet habe, und nach dem Übertragen (über intellij) kann ich dann den gesamten Verlauf sehen (einschließlich des Verlaufs, wenn er sich an einem anderen Ort befand), wenn ich den Verlauf (wieder in intellij) ansehe. Ich gehe davon aus, dass intellij nichts Besonderes tut, um das zu tun, also ist es schön zu wissen, dass zumindest die Historie nachvollzogen werden kann.

0 Stimmen

Für die Regeln, denen Git bei der Erkennung einer Verzeichnisumbenennung folgt, siehe meine Antwort unten

6voto

Junior Punkte 184

Einfach die Datei verschieben und Bühne mit:

git add .

Vor der Übertragung können Sie den Status überprüfen:

git status

Das wird sich zeigen:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    old-folder/file.txt -> new-folder/file.txt

Ich habe mit Git Version 2.26.1 getestet.

Auszug aus GitHub-Hilfeseite .

4voto

John S Gruber Punkte 228

Das Kernstück von Git, das Git-Klempnerprogramm, zeichnet zwar keine Umbenennungen auf, aber die Historie, die Sie mit dem Git-Protokoll "Porzellan" anzeigen, kann diese erkennen, wenn Sie möchten.

Für eine bestimmte git log verwenden Sie die Option -M:

git log -p -M

Mit einer aktuellen Version von Git.

Dies gilt auch für andere Befehle wie git diff auch.

Es gibt Optionen, um die Vergleiche mehr oder weniger streng zu gestalten. Wenn Sie eine Datei umbenennen, ohne gleichzeitig wesentliche Änderungen an der Datei vorzunehmen, ist es für Git-Log und Co. einfacher, die Umbenennung zu erkennen. Aus diesem Grund benennen manche Leute Dateien in einem Commit um und ändern sie in einem anderen.

Es kostet CPU-Leistung, wenn man Git bittet, herauszufinden, wo Dateien umbenannt wurden, also liegt es an Ihnen, ob und wann Sie es benutzen.

Wenn Sie möchten, dass Ihre Historie immer mit der Erkennung von Umbenennungen in einem bestimmten Repository gemeldet wird, können Sie dies verwenden:

git config diff.renames 1

Verschieben von Dateien von einem Verzeichnis in ein anderes ist entdeckt. Hier ist ein Beispiel:

commit c3ee8dfb01e357eba1ab18003be1490a46325992
Author: John S. Gruber <JohnSGruber@gmail.com>
Date:   Wed Feb 22 22:20:19 2017 -0500

    test rename again

diff --git a/yyy/power.py b/zzz/power.py
similarity index 100%
rename from yyy/power.py
rename to zzz/power.py

commit ae181377154eca800832087500c258a20c95d1c3
Author: John S. Gruber <JohnSGruber@gmail.com>
Date:   Wed Feb 22 22:19:17 2017 -0500

    rename test

diff --git a/power.py b/yyy/power.py
similarity index 100%
rename from power.py
rename to yyy/power.py

Bitte beachten Sie, dass dies immer funktioniert, wenn Sie diff verwenden, nicht nur bei git log . Zum Beispiel:

$ git diff HEAD c3ee8df
diff --git a/power.py b/zzz/power.py
similarity index 100%
rename from power.py
rename to zzz/power.py

Versuchsweise habe ich eine kleine Änderung in einer Datei in einem Feature-Zweig vorgenommen und diese festgeschrieben, dann habe ich die Datei im Master-Zweig umbenannt, festgeschrieben und dann eine kleine Änderung in einem anderen Teil der Datei vorgenommen und diese festgeschrieben. Als ich zum Funktionszweig wechselte und vom Masterzweig aus zusammenführte, wurde die Datei umbenannt und die Änderungen wurden zusammengeführt. Hier ist die Ausgabe der Zusammenführung:

 $ git merge -v master
 Auto-merging single
 Merge made by the 'recursive' strategy.
  one => single | 4 ++++
  1 file changed, 4 insertions(+)
  rename one => single (67%)

Das Ergebnis war ein Arbeitsverzeichnis, in dem die Datei umbenannt und beide Textänderungen vorgenommen wurden. Es ist also möglich, dass Git das Richtige tut, obwohl es Umbenennungen nicht explizit verfolgt.

Dies ist eine späte Antwort auf eine alte Frage, so dass die anderen Antworten für die damalige Git-Version korrekt gewesen sein können.

3voto

Jakub Pawlowski Punkte 242

Erstellen Sie zunächst eine eigenständige Übergabe mit nur einer Umbenennung.

Dann werden alle eventuellen Änderungen am Inhalt der Datei in einer separaten Übergabe gespeichert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X