Wie kann ich verhindern, dass Git denkt, ich hätte eine Umbenennung vorgenommen?

77

Ich habe zwei Dateien index.htmlund template.html. Ich zog die meisten index.htmlin template.htmlund jetzt git denkt , dass ich ein Umbenennungs tat , als ich beide Dateien hinzufügen. Ist es möglich, dies in bestimmten Fällen zu verhindern?

Kit Sunde
quelle
25
Git speichert nicht die Tatsache, dass es denkt, dass Sie eine Umbenennung vorgenommen haben. In der eigentlichen Objektdatenbank werden nur vollständige Snapshots Ihres Projekts gespeichert, und es gibt kein Konzept für ein Diff / Rename / Move. Die Tatsache, dass Git angibt, dass Sie eine Datei umbenannt haben, stammt aus der Nachanalyse der Datenbank.
Jacob Grundwasser
5
@JacobGroundwater Oh, ich verstehe, also spielt es einfach keine Rolle. Vielen Dank. :)
Kit Sunde

Antworten:

22

Es gibt eine "akzeptierte" Antwort, die jedoch keinen Hinweis auf die Beantwortung der Frage gibt.

Die richtige Antwort aus git-log (1) und git-diff (1) lautet:

   --no-renames
       Turn off rename detection, even when the configuration
       file gives the default to do so.
Matte
quelle
4
Während dies für einige Anwendungsfälle funktioniert, lautete die ursprüngliche Frage: "Ist es möglich, diese [Umbenennungserkennung] in bestimmten Fällen zu verhindern?" Das Flag, das Sie verwenden, deaktiviert es überall in ~ / .gitconfig oder für den gesamten aktuellen Lauf in der Befehlszeile. Selbst Elemente mit einem Ähnlichkeitsindex von> = 99% werden nicht als Umbenennungen angesehen, was normalerweise nicht den Erwartungen entspricht und möglicherweise gegen das Prinzip der geringsten Überraschung verstößt. Trotzdem gibt es definitiv Anwendungsfälle für die Flagge, sonst würde sie nicht existieren. Vielen Dank, dass Sie hier darauf hingewiesen haben!
Todd A. Jacobs
64

Warum Git denkt, dass Ihre Dateien Kopien sind

Git verfolgt Inhalte , keine Dateinamen. Wenn zwei Dateien einen im Wesentlichen ähnlichen Inhalt haben, glaubt git, dass Sie die Datei kopiert oder umbenannt haben. Wenn Sie git-log (1) lesen, lernen Sie:

Der Ähnlichkeitsindex ist der Prozentsatz der unveränderten Zeilen, und der Unähnlichkeitsindex ist der Prozentsatz der geänderten Zeilen. Es ist eine abgerundete Ganzzahl, gefolgt von einem Prozentzeichen. Der Ähnlichkeitsindexwert von 100% ist daher für zwei gleiche Dateien reserviert, während 100% Unähnlichkeit bedeutet, dass keine Zeile aus der alten Datei in die neue Datei gelangt ist.

Angenommen, Ihr Ähnlichkeitsindex ist 100%, wird Git denken, dass dies eine Kopie ist. Am besten fügen Sie eine sinnvolle Protokollnachricht oder Notiz hinzu (siehe Git-Notizen (1) für weitere Informationen), um zu erklären, was los ist, wenn Sie nicht glauben, dass Git das Richtige tut.

Anpassen des Ähnlichkeitsindex

Sie können auch versuchen, die Werte anzupassen, die git verwendet, um etwas als Kopie oder Umbenennung zu betrachten. Das Handbuch für Git-Log (1) sagt:

-M[<n>], --find-renames[=<n>]

If generating diffs, detect and report renames for each commit. For
following files across renames while traversing history, see --follow. If
n is specified, it is a threshold on the similarity index (i.e. amount
of addition/deletions compared to the file’s size). For example, -M90%
means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.

-C[<n>], --find-copies[=<n>]    

Detect copies as well as renames. See also --find-copies-harder.
If n is specified, it has the same meaning as for -M<n>.

Auch dies hilft Ihnen nicht, wenn die Dateien größtenteils ähnlich sind, aber Sie können diese Werte sicherlich verwenden, um zu optimieren, wie ähnlich sie sein müssen, um als Kopien oder Umbenennungen betrachtet zu werden. Ihr Kilometerstand kann variieren.

Todd A. Jacobs
quelle
5
Ich möchte nur darauf hinweisen, dass diese Antwort viel hilfreicher und
aussagekräftiger ist
1
Dieser zweistufige Prozess vor einem Commit funktioniert: Git Mehrdeutige Datei zurücksetzen, Git Commit, Git Mehrdeutige Datei hinzufügen, Git Commit.
Basil Musa
21

Wenn Sie sich kurz vor einem Commit befinden und "Sie fühlen sich schlecht, dass Git verrückt geworden ist", machen Sie einfach das Hinzufügen der mehrdeutigen Datei rückgängig, die Sie umbenannt haben, führen Sie ein Commit durch, fügen Sie die mehrdeutige Datei erneut hinzu und schreiben Sie Folgendes fest:

git reset ambiguous_file_git_thought_you_renamed
git commit
git add ambiguous_file_git_thought_you_renamed
git commit

Das hat bei mir funktioniert.

Überprüfen Sie, ob keine Umbenennung stattgefunden hat:

git diff --name-status -C HEAD^^ HEAD
M       ambiguous_file_git_thought_you_renamed
M       original_file

"M" am Anfang bedeutet geändert, "R" bedeutet umbenannt. Beachten Sie, dass hier keine Umbenennung vorhanden ist.

Basilikum Musa
quelle
3
Muss der zweite git commitdas --amendFlag haben, um die Änderung in dasselbe Commit aufzunehmen? Ich habe die Flagge hinzugefügt, und dies hat bei mir funktioniert, um die Umbenennungserkennung zu umgehen.
BillyBBone
1
Wenn sie im selben Commit landen, entscheidet irgendwann etwas, dass sie umbenannt wurden. Die einzige Möglichkeit, dies wirklich zu verhindern, besteht darin, sie für immer in getrennten Verpflichtungen zu halten.
Miral
0

Wenn Sie die Dateien A, B und C geändert haben; und gelöschte Datei D, E und F; Es besteht die Möglichkeit, dass Git denkt, D wird in A oder ähnliches umbenannt.

Die einfachste Lösung besteht darin, Dateiänderungen und -löschungen in zwei Commits aufzuteilen.

Harry
quelle
-1

Um zu umgehen, dass Git denkt, es sei eine Umbenennung in "One" Commit.

  1. Stellen Sie Ihre Änderungen bereit, die die fehlerhafte Umbenennung nicht auslösen
  2. Stellen Sie die verbleibenden Dateien bereit, bei denen git den Eindruck hatte, dass sie umbenannt und festgeschrieben wurden git commit --amend
wyu
quelle
1
Das funktioniert nicht . Es wird immer noch angenommen, dass ich eine der Dateien bearbeitet habe. Durch die Verwendung von kann --editich in den (neuen) Kommentaren in der Commit-Nachricht sehen, was meiner Meinung nach vor sich geht.
Bilderstürmer