521 Stimmen

Handhabung von Dateiumbenennungen in Git

Das hatte ich gelesen, als Umbenennen von Dateien in Git Wenn Sie die Datei umbenannt haben, sollten Sie alle Änderungen festschreiben, die Datei umbenennen und dann die umbenannte Datei bereitstellen. Git erkennt die Datei anhand ihres Inhalts, anstatt sie als neue, nicht verfolgte Datei zu betrachten, und behält den Änderungsverlauf bei.

Als ich jedoch heute Abend genau das tat, kehrte ich zurück zu git mv .

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

Ich habe mein Stylesheet umbenannt in Finder から iphone.css a mobile.css :

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    deleted:    css/iphone.css
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    css/mobile.css

Git denkt nun, ich hätte eine CSS-Datei gelöscht und eine neue hinzugefügt. Das ist nicht das, was ich will. Machen wir die Umbenennung rückgängig und lassen Git die Arbeit machen.

> $ git reset HEAD .
Unstaged changes after reset:
M    css/iphone.css
M    index.html

Ich bin wieder da, wo ich angefangen habe:

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

Verwenden wir git mv stattdessen:

> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    renamed:    css/iphone.css -> css/mobile.css
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   index.html
#

Es sieht so aus, als wäre alles in Ordnung. Warum hat Git die Umbenennung nicht gleich beim ersten Mal erkannt, als ich den Finder benutzt habe?

9voto

albfan Punkte 11604

Betrachten wir Ihre Dateien einmal aus der Perspektive von Git.

Denken Sie daran, dass Git keine Metadaten über Ihre Dateien aufzeichnet.

Ihr Repository enthält (unter anderem)

$ cd repo
$ ls
...
iphone.css
...

Und sie steht unter der Kontrolle von Git:

$ git ls-files --error-unmatch iphone.css &>/dev/null && echo file is tracked
file is tracked

Testen Sie dies mit:

$ touch newfile
$ git ls-files --error-unmatch newfile &>/dev/null && echo file is tracked
(no output, it is not tracked)
$ rm newfile

Wenn Sie das tun

$ mv iphone.css mobile.css

Aus der Perspektive von Git,

  • gibt es keine iphone.css (er wird gelöscht -git warnt davor-).
  • es gibt eine neue Datei mobile.css .
  • Diese Dateien haben nichts miteinander zu tun.

Git berät also über Dateien, die es bereits kennt ( iphone.css ) und neu entdeckte Dateien ( mobile.css ), aber nur wenn sich Dateien im Index oder HEAD befinden, beginnt Git, deren Inhalt zu überprüfen.

Im Moment sind weder "iphone.css löschen" noch mobile.css sind im Index enthalten.

Hinzufügen der Löschung von iphone.css in den Index:

$ git rm iphone.css

Git sagt Ihnen genau, was passiert ist ( iphone.css gelöscht wird. Es ist nichts weiter passiert):

Fügen Sie dann die neue Datei mobile.css :

$ git add mobile.css

Diesmal stehen sowohl die gelöschte als auch die neue Datei im Index. Jetzt erkennt Git, dass der Kontext derselbe ist, und macht es als Umbenennung kenntlich. Wenn die Dateien zu 50% ähnlich sind, erkennt Git dies als Umbenennung und lässt Sie die mobile.css umbenannt werden, während der Vorgang als Umbenennung beibehalten wird.

Siehe dies ist reproduzierbar auf git diff . Jetzt, wo Ihre Dateien im Index sind, müssen Sie --cached . Bearbeiten mobile.css ein bisschen, fügen Sie das zum Index hinzu und sehen Sie den Unterschied zwischen:

$ git diff --cached

y

$ git diff --cached -M

-M ist die Option "Umbenennungen erkennen" für git diff . -M steht für -M50% (bei 50% oder mehr Ähnlichkeit wird Git es als Umbenennung ausgeben), aber Sie können dies reduzieren auf -M20% (20%) wenn Sie die Datei mobile.css eine Menge.

3voto

Mike Seplowitz Punkte 8897

Sie haben die Ergebnisse Ihrer Finder-Bewegung nicht inszeniert. Ich glaube, wenn Sie die Verschiebung über Finder durchgeführt haben und dann git add css/mobile.css ; git rm css/iphone.css würde Git den Hash der neuen Datei berechnen und erst dann feststellen, dass die Hashes der Dateien übereinstimmen (und es sich somit um eine rena

2voto

doozMen Punkte 627

Für Xcode-Benutzer: Wenn Sie Ihre Datei in Xcode umbenennen, sehen Sie, dass sich das Abzeichensymbol in "Anhängen" ändert. Wenn Sie eine Übergabe mit Xcode durchführen, erstellen Sie tatsächlich eine neue Datei und verlieren den Verlauf.

Eine Umgehung ist einfach, aber Sie müssen es vor dem Festlegen mit Xcode tun:

  1. Ein Git machen Status auf Ihren Ordner. Sie sollten sehen, dass die abgestuften Änderungen korrekt sind:

    renamed:    Project/OldName.h -> Project/NewName.h
    renamed:    Project/OldName.m -> Project/NewName.m
  2. Do commit -m 'name change'

    Gehen Sie dann zurück zu Xcode und Sie werden sehen, dass sich das Abzeichen von A zu M geändert hat und dass es gespeichert ist, um zukünftige Änderungen in Xcode zu übertragen.

2voto

bryce Punkte 2682

Ich bin gerade auf dieses Problem gestoßen - wenn Sie eine Reihe von Dateien aktualisiert haben und nicht git mv alle funktioniert das auch:

  1. Übergeordnetes Verzeichnis umbenennen von /dir/RenamedFile.js a /whatever/RenamedFile.js .
  2. git add -A diese Veränderung zu inszenieren
  3. Übergeordnetes Verzeichnis zurückbenennen in /dir/RenamedFile.js .
  4. git add -A noch einmal, wird gegen diese Änderung re-stagen, was Git zwingt, die Änderung des Dateinamens zu übernehmen.

1voto

Abdulrahman Bres Punkte 2375

Getestet am Git 2.33 unter Fenster 10

  1. Benennen Sie die benötigten Ordner und Dateien im Explorer um.
  2. git add .
  3. git commit -m "commit message"
  4. git push

Git wird die Umbenennungen erkennen. Sie können dies überprüfen, indem Sie git status (nach der Begehung)

enter image description here

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