774 Stimmen

Wie kann man Git dazu bringen, eine gelöschte und eine neue Datei als eine Dateiverschiebung zu markieren?

Ich habe eine Datei manuell verschoben und sie dann geändert. Laut Git ist es eine neue Datei und eine entfernte Datei. Gibt es eine Möglichkeit, Git zu zwingen, es als Dateiverschiebung zu behandeln?

3 Stimmen

Für eine bestimmte Datei old_file.txt entonces git mv old_file.txt new_file.txt ist gleichbedeutend mit git rm --cached old_file.txt , mv old_file.txt new_file.txt , git add new_file.txt .

6 Stimmen

Jarl: Nein, ist es nicht. Wenn es auch Änderungen innerhalb der Datei gibt, git mv werden sie nicht in den Cache aufgenommen, sondern git add wird. Ich ziehe es vor, die Datei zurück zu verschieben, damit ich die git mv entonces git add -p um meinen Änderungssatz zu überprüfen.

0 Stimmen

37voto

Zingam Punkte 4220

Oder Sie könnten die Antwort auf diese Frage ausprobieren aquí von Bernstein ! Um es noch einmal zu zitieren:

Brechen Sie zunächst das staged add für die manuell verschobene Datei ab:

$ git reset path/to/newfile
$ mv path/to/newfile path/to/oldfile

Verwenden Sie dann Git, um die Datei zu verschieben:

$ git mv path/to/oldfile path/to/newfile

Wenn Sie die manuelle Verschiebung bereits durchgeführt haben, sollten Sie stattdessen auf die Revision vor der Verschiebung zurücksetzen und dann einfach git mv von dort aus ausführen.

12 Stimmen

Beachten Sie, dass dies nicht funktioniert, wenn Sie auch wesentliche Änderungen haben, was bei kleinen Dateien normalerweise der Fall ist. Sie werden als "Löschen" und "Erstellen" übertragen. In einem solchen Fall ist die einzige Möglichkeit wohl "Verschieben und Ändern in separaten Commits durchführen" wie in einer anderen Antwort vorgeschlagen.

24voto

BoD Punkte 10481

Wenn Sie über git status die Umbenennungen nicht anzeigt, versuchen Sie git commit --dry-run -a stattdessen

11voto

coldfix Punkte 5600

Die anderen Antworten decken bereits ab, dass Sie einfach git add NEW && git rm OLD damit Git die Verschiebung erkennt.

Wenn Sie jedoch die Datei im Arbeitsverzeichnis bereits geändert haben, wird die add + rm Ansatz fügt die Änderungen in den Index ein, was in einigen Fällen unerwünscht sein kann (z.B. im Falle von umfangreichen Änderungen erkennt Git möglicherweise nicht mehr, dass es sich um eine Umbenennung einer Datei handelt).

Nehmen wir an, Sie möchten die umbenennen zum Index, aber keine Änderungen. Der offensichtliche Weg, dies zu erreichen, ist eine Umbenennung hin und her mv NEW OLD && git mv OLD NEW .

Es gibt aber auch eine (etwas kompliziertere) Möglichkeit, dies direkt im Index zu tun, ohne die Datei im Arbeitsbaum umzubenennen:

info=$(git ls-files -s -- "OLD" | cut -d' ' -f-2 | tr ' ' ,)
git update-index --add --cacheinfo "$info,NEW" &&
  git rm --cached "$old"

Dies kann auch als Alias in Ihrer ~/.gitconfig :

[alias]
    mv-index = "!f() { \
      old=\"$1\"; \
      new=\"$2\"; \
      info=$(git ls-files -s -- \"$old\" | cut -d' ' -f-2 | tr ' ' ,); \
      git update-index --add --cacheinfo \"$info,$new\" && \
      git rm --cached \"$old\"; \
    }; f"

1 Stimmen

+1, leider gibt es keine Möglichkeit, dies direkt mit git mv zu tun, wie z.B. mit --cached In meinem Fall habe ich ein ganzes Verzeichnis verschoben, daher verwende ich einen etwas anderen Weg: git ls-files -s -- OLD |sed 's#\tOLD/#\tNEW/#' gefolgt von git rm -r --cached OLD . NB: Die \t und nachlaufende / in sed das Tab-Zeichen vor dem Pfad und dem Verzeichnistrennzeichen abgleichen, verwenden Sie den vollständigen Pfad aus dem Stammverzeichnis Ihres Repos (dies stellt sicher, dass Sie nur dieses Verzeichnis abgleichen und nicht irgendeine ähnlich benannte Datei/Verzeichnis).

11voto

Giles Roberts Punkte 5998

Wenn Sie TortoiseGit verwenden, ist es wichtig zu wissen, dass die automatische Erkennung von Umbenennungen in Git während der Übergabe stattfindet, aber die Tatsache, dass dies geschehen wird, wird nicht immer vorher von der Software angezeigt. Ich hatte zwei Dateien in ein anderes Verzeichnis verschoben und einige kleinere Änderungen vorgenommen. Ich verwende TortoiseGit als mein Übergabeprogramm und die Liste der vorgenommenen Änderungen zeigte, dass die Dateien gelöscht und hinzugefügt, nicht aber verschoben wurden. Ein Aufruf von git status auf der Kommandozeile zeigte eine ähnliche Situation. Nachdem ich die Dateien jedoch übertragen hatte, wurden sie im Protokoll als umbenannt angezeigt. Die Antwort auf Ihre Frage lautet also: Solange Sie nichts allzu Drastisches getan haben, sollte Git die Umbenennung automatisch übernehmen.

Edit: Wenn man die neuen Dateien hinzufügt und dann einen Git-Status auf der Kommandozeile ausführt, sollte die Umbenennung vor dem Commit angezeigt werden.

Edit 2: Zusätzlich fügen Sie in TortoiseGit die neuen Dateien im Übertragen-Dialog hinzu, ohne sie zu übertragen. Wenn Sie dann den Befehl Protokoll anzeigen aufrufen und sich das Arbeitsverzeichnis ansehen, werden Sie sehen, ob Git die Umbenennung vor dem Übertragen erkannt hat.

Die gleiche Frage wurde hier gestellt: https://tortoisegit.org/issue/1389 und wurde hier als zu behebender Fehler protokolliert: https://tortoisegit.org/issue/1440 Es hat sich herausgestellt, dass es sich um ein Anzeigeproblem im Übertragen-Dialog von TortoiseGit handelt und auch im Git-Status vorhanden ist, wenn Sie die neuen Dateien nicht hinzugefügt haben.

8voto

mostafa.elhoushi Punkte 2284

Verwenden Sie git mv um die Dateien zu verschieben, anstatt die Verschiebebefehle des Betriebssystems zu verwenden: https://git-scm.com/docs/git-mv

Bitte beachten Sie, dass git mv gibt es nur in Git-Versionen 1.8.5 und höher. Sie müssen also möglicherweise Ihr Git aktualisieren, um diesen Befehl verwenden zu können.

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