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

4voto

cedd Punkte 1609

Ich hatte dieses Problem kürzlich, als ich einige Dateien verschoben (aber nicht geändert) habe.

Das Problem ist, dass Git einige Zeilenenden geändert hat, als ich die Dateien verschoben habe, und dann nicht in der Lage war zu erkennen, dass die Dateien identisch sind.

Verwendung von git mv hat das Problem gelöst, aber es funktioniert nur bei einzelnen Dateien/Verzeichnissen, und ich hatte eine Menge Dateien im Stamm des Repositorys zu bearbeiten.

Eine Möglichkeit, dies zu beheben, wäre ein wenig Bash-/Batch-Magie.

Eine andere Möglichkeit ist die folgende

  • Verschieben Sie die Dateien und git commit . Dadurch werden die Zeilenenden aktualisiert.
  • Verschieben Sie die Dateien mit den neuen Zeilenenden zurück an ihren ursprünglichen Speicherort, und git commit --amend
  • Verschieben Sie die Dateien erneut und git commit --amend . Diesmal gibt es keine Änderung der Zeilenenden, so dass Git zufrieden ist.

0voto

harshainfo Punkte 431

Ich verstehe die Frage so: "Wie kann man Git dazu bringen, das Löschen einer alten Datei und das Anlegen einer neuen Datei als eine Dateiverschiebung zu erkennen".

Ja, im Arbeitsverzeichnis, wenn Sie eine alte Datei löschen und eine alte Datei einfügen, git status wird sagen " deleted: old_file " und " Untracked files: ... new_file "

Im Staging-Index bzw. der Staging-Ebene wird das Hinzufügen und Entfernen von Dateien mit Git jedoch als Dateiverschiebung erkannt. Um dies zu erreichen, geben Sie folgende Befehle ein, vorausgesetzt, Sie haben die Löschung und Erstellung mit Ihrem Betriebssystem durchgeführt:

git add new_file
git rm old_file

Wenn der Inhalt der Datei zu 50% oder mehr übereinstimmt, wird git status sollten Sie erhalten:

renamed: old_file -> new_file

2 Stimmen

git status wird sagen " deleted: old_file " und " Untracked files: ... new_file ": Nicht seit Git 2.18: stackoverflow.com/a/50573107/6309

0voto

Alex Ilie Punkte 35

Bei mir hat es funktioniert, alle Änderungen vor dem Commit zu speichern und sie wieder herauszuholen. Dadurch hat Git die hinzugefügten/gelöschten Dateien erneut analysiert und sie korrekt als verschoben markiert.

-1voto

Jon Rea Punkte 8959

Wahrscheinlich gibt es eine bessere "Kommandozeilen"-Methode, um dies zu tun, und ich weiß, dass dies ein Hack ist, aber ich habe nie eine gute Lösung finden können.

Mit TortoiseGIT: Wenn Sie einen GIT Commit haben, bei dem einige Dateiverschiebungen als Hinzufügen/Löschen und nicht als Umbenennen angezeigt werden, obwohl die Dateien nur kleine Änderungen aufweisen, dann tun Sie dies:

  1. Überprüfen Sie, was Sie vor Ort getan haben
  2. Einchecken einer kleinen einzeiligen Änderung in einer 2.
  3. Gehen Sie zum GIT-Protokoll in tortoise git
  4. Markieren Sie die beiden Übertragungen, klicken Sie mit der rechten Maustaste und wählen Sie "Zu einer Übertragung zusammenführen".

Der neue Commit zeigt nun die Umbenennungen der Dateien korrekt an was dazu beiträgt, einen korrekten Dateiverlauf zu erhalten.

-3voto

Hativ Punkte 1402

Wenn ich eine Datei gleichzeitig bearbeite, umbenenne und verschiebe, funktioniert keine dieser Lösungen. Die Lösung ist, es in zwei Commits zu machen (bearbeiten und umbenennen/verschieben getrennt) und dann fixup die zweite Übertragung über git rebase -i um sie in einer einzigen Übertragung zu haben.

1 Stimmen

-1: Das Ergebnis ist dasselbe wie das Verschieben und Ändern der Datei in derselben Übertragung - nur mit zusätzlichen Schritten. Es funktioniert nicht.

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