406 Stimmen

Was ist der Zweck von git-mv?

Soweit ich weiß, muss Git nicht wirklich die Datei Umbenennungs-/Verschiebungs-/Kopiervorgänge, was ist also der eigentliche Zweck von git mv ? Die Manpage ist nicht besonders aussagekräftig...

Ist sie veraltet? Handelt es sich um einen internen Befehl, der nicht von normalen Benutzern verwendet werden soll?

17voto

M. Justin Punkte 8707

git mv verschiebt die Datei und aktualisiert den Index, um den ersetzten Dateipfad festzuhalten, sowie alle betroffenen Git-Submodule zu aktualisieren. Anders als bei einer manuellen Verschiebung werden auch reine Umbenennungen erkannt, die sonst von Git nicht als Änderung erkannt würden.

Es verhält sich ähnlich (wenn auch nicht identisch) wie das Verschieben der Datei außerhalb von git, wobei der alte Pfad aus dem Index entfernt wird, indem git rm und das Hinzufügen der neuen Datei in den Index mit git add .

Antwort Motivation

Auf diese Frage gibt es eine Menge guter Teilantworten. Diese Antwort ist ein Versuch, sie zu einer einzigen zusammenhängenden Antwort zu kombinieren. Eine Sache, die in keiner der anderen Antworten erwähnt wird, ist die Tatsache, dass die Manpage beantwortet die Frage zwar größtenteils, aber sie ist vielleicht nicht so offensichtlich, wie sie sein könnte.

Ausführliche Erläuterung

In der Manpage werden drei verschiedene Effekte genannt:

  1. Die Datei, das Verzeichnis oder der Symlink wird im Dateisystem verschoben:

    git-mv - Verschieben oder Umbenennen einer Datei, eines Verzeichnisses oder eines Symlinks

  2. Der Index wird aktualisiert, indem der neue Pfad hinzugefügt und der vorherige entfernt wird:

    Nach erfolgreichem Abschluss wird der Index aktualisiert, aber die Änderung muss noch bestätigt werden.

  3. Verschobene Untermodule werden aktualisiert, damit sie am neuen Ort funktionieren:

    Das Verschieben eines Submoduls, das eine Git-Datei verwendet (was bedeutet, dass es mit einer Git-Version 1.7.8 oder neuer geklont wurde), aktualisiert die Git-Datei und die core.worktree-Einstellung, damit das Submodul am neuen Ort funktioniert. Außerdem wird versucht, die Einstellung submodule.<name>.path in der Datei gitmodules(5) und stellt diese Datei bereit (es sei denn, -n wird verwendet).

Wie bereits in diese Antwort , git mv ist dem Verschieben der Datei sehr ähnlich, wobei der neue Pfad zum Index hinzugefügt und der vorherige Pfad aus dem Index entfernt wird:

mv oldname newname
git add newname
git rm oldname

Da jedoch diese Antwort weist darauf hin, git mv ist in seinem Verhalten nicht genau mit diesem identisch. Das Verschieben der Datei über git mv fügt den neuen Pfad in den Index ein, aber nicht den geänderten Inhalt der Datei. Bei Verwendung der drei einzelnen Befehle wird dagegen die gesamte Datei in den Index aufgenommen, einschließlich aller geänderten Inhalte. Dies könnte relevant sein, wenn ein Arbeitsablauf verwendet wird, der den Index anpasst, anstatt alle Änderungen in der Datei hinzuzufügen.

Außerdem, wie bereits in diese Antwort y dieser Kommentar , git mv hat den zusätzlichen Vorteil, dass es Umbenennungen auf Dateisystemen, die nur aus Großbuchstaben bestehen, verarbeiten kann. Groß- und Kleinschreibung wird nicht berücksichtigt sondern case-preserving wie es in aktuellen macOS- und Windows-Dateisystemen oft der Fall ist. In solchen Systemen würde Git zum Beispiel nicht erkennen, dass sich der Dateiname geändert hat, nachdem eine Datei über mv Mytest.txt MyTest.txt während mit git mv Mytest.txt MyTest.txt seinen Namen erfolgreich aktualisieren würde.

0 Stimmen

Die Art und Weise, wie git mv in neueren Versionen von git eine vereinfachte Verschiebung von Submodulen ermöglicht, ist eine massive Verbesserung des Arbeitsablaufs.

12voto

dhardy Punkte 9426

Ich habe noch eine andere Verwendung für git mv die oben nicht erwähnt wurden.

Seit der Entdeckung git add -p (der Patch-Modus von git add; siehe http://git-scm.com/docs/git-add ), verwende ich es gerne, um Änderungen zu überprüfen, während ich sie in den Index aufnehme. Mein Arbeitsablauf sieht also so aus: (1) Arbeit am Code, (2) Überprüfung und Hinzufügen zum Index, (3) Übertragen.

Wie funktioniert git mv hineinpassen? Wenn Sie eine Datei direkt verschieben, verwenden Sie git rm y git add Alle Änderungen werden in den Index aufgenommen, und die Verwendung von git diff zum Anzeigen von Änderungen ist weniger einfach (vor dem Übertragen). verwenden git mv fügt jedoch den neuen Pfad in den Index ein, nicht aber die Änderungen an der Datei, so dass git diff y git add -p wie gewohnt zu arbeiten.

1voto

Stefan Karlsson Punkte 1012

Vielleicht git mv hat sich seit der Veröffentlichung dieser Antworten geändert, so dass ich sie kurz aktualisieren werde. Meiner Ansicht nach, git mv es no treffend als Kurzform für beschrieben:

 # not accurate: #
 mv oldname newname
 git add newname
 git rm oldname

Ich verwende git mv häufig aus zwei Gründen, die in früheren Antworten nicht beschrieben wurden:

  1. Verschieben großer Verzeichnisstrukturen mit gemischtem Inhalt aus verfolgten und nicht verfolgten Dateien. Sowohl verfolgte als auch nicht verfolgte Dateien werden verschoben und behalten ihren Verfolgungs- bzw. Nichtverfolgungsstatus

  2. Beim Verschieben großer Dateien und Verzeichnisse habe ich immer angenommen, dass git mv wird die Größe der Repository-DB-Historie reduziert. Dies liegt daran, dass das Verschieben/Umbenennen einer Datei ein Indizierungs-/Referenzdelta ist. Ich habe diese Annahme nicht überprüft, aber sie erscheint logisch.

0 Stimmen

Die Logik teile auch ich, aber wie Spock sagen würde: "Es ist nicht logisch" (mit einer hochgezogenen Augenbraue).

1 Stimmen

2 ist definitiv nicht korrekt. git adressiert Objekte, einschließlich Dateien, basierend auf einem Hash ihrer Inhalt , nicht ihre Standort . Wenn zwei Dateien unabhängig von ihrem Namen und Speicherort den gleichen Inhalt haben, werden sie als das gleiche Objekt und nur einmal gespeichert. Es spielt nicht nur keine Rolle, wie Sie eine Datei umbenennen, Sie können auch mehrere Kopien gleichzeitig haben oder eine Datei wieder einführen, die Sie vor 20 Commits gelöscht haben, und Git wird einfach den Hash berechnen, feststellen, dass das Objekt bereits in der Datenbank ist, und nichts Neues speichern.

0 Stimmen

@IMSoP, ich denke, dass Ihre Verwendung des Begriffs "Adressen" zweideutig ist. Natürlich behandelt Git die Speicherorte von Dateien und Ordnern und verwendet diese, um verschiedene Dateien zu unterscheiden. Wenn zwei Dateien denselben Inhalt und sogar denselben Dateinamen haben (nur einen anderen Pfad), können sie von GIT nicht auf die von Ihnen beschriebene Weise verbunden werden, da dies die Verfolgung der Dateihistorie unterbrechen würde. Sie können dies leicht testen, indem Sie den Git-Status einer beliebigen Projektgruppe überprüfen. Sehen Sie den Unterschied zwischen einem git mv und einem normalen mv, gefolgt von einem git add

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