TortoiseGit: Das Verschieben von Dateien in einen neuen Ordner wird nicht als Verschieben erkannt

4798
Dries

Ich versuche, einige Dateien in meinem Repository in einen neuen Ordner zu verschieben. Ich möchte, dass git / TortoiseGit erkennt, dass es sich um einen Zug anstelle eines Löschvorgangs handelt und mehrere hinzugefügt werden.
Wie kann ich diese Arbeit machen? Ich habe die Dokumentation von TortoiseGit durchgesehen und Google durchsucht, aber das schien nicht sehr nützlich zu sein.

Was ich also habe, ist diese Struktur:

repo_root/somefile.txt 

Was ich möchte:

repo_root/new_folder/somefile.txt 

Natürlich steht "somefile.txt" für alle Dateien und Ordner, die verschoben werden.

6

2 Antworten auf die Frage

9
Yue Lin Ho

Erinnern Sie sich an eines: Git verfolgt nur den Inhalt der Datei.

Aus dem Abschnitt zum Verschieben von Dateien von Pro Git book v2:

Im Gegensatz zu vielen anderen VCS-Systemen verfolgt Git die Verschiebung von Dateien nicht explizit. Wenn Sie eine Datei in Git umbenennen, werden keine Metadaten in Git gespeichert, die Sie darüber informieren, dass Sie die Datei umbenannt haben. Allerdings ist Git ziemlich klug, das hinterher zu verstehen

Bewegen und Umbenennen ist in Git dasselbe.

So erkennt Git die Bewegungs / umbenennen automatisch nur unter der Prämisse funktioniert, dass diese Dateien nicht verändert werden .

Git tut diese Dinge, wenn Sie nur eine Datei verschieben / umbenennen:

  1. Eine nachverfolgte Datei wird gelöscht, git erhält den SHA-1 des Dateiinhalts. Angenommen, der Wert ist abc.
  2. Eine untrack-Datei wird hinzugefügt. Git berechnet den SHA-1 des Dateiinhalts. Angenommen, der Wert ist abcebenfalls.
  3. Wenn Sie in diesem Moment einen Commit ausführen, wird git feststellen, dass sie denselben SHA-1-Wert haben, und behandeln sie dann als Umbenennung.

Angenommen, Sie haben einige verfolgte Dateien geändert und sie auch in einen anderen Ordner verschoben. Dann kann git sie beim Commit leider nicht automatisch umbenennen / verschieben.

Wenn Sie wirklich möchten, dass git das Umbenennen / Bewegen automatisch verfolgt, müssen Sie Folgendes tun :

Stellen Sie sicher, dass Sie die Datei (en) NICHT modifizieren und Dateien nur in einem Commit umbenennen / verschieben.


Wenn Sie die Datei ändern und gleichzeitig verschieben möchten und git sie mit TortoiseGit als Umbenennen / Verschieben erkennen möchte, dann in Ihrem Fall:

  1. Klicken Sie mit der rechten Maustaste auf diese Datei und klicken Sie auf das TortoiseGit -> Rename...Kontextmenü.
  2. Präfix new_folder\vor dem Dateinamen, siehe:
  3. verpflichten

Hinweis: Sie müssen die Dateien einzeln umbenennen. Angenommen, es gibt viel zu tun. Umbenennen Sie also nur die Datei.

Hinweis2: Wenn Sie viele Dateien ändern, kann git nicht feststellen, dass es sich um ein Umbenennen / Verschieben handelt.

Großartig. Das ist jetzt eine ** ausgezeichnete ** Antwort;) DavidPostill vor 7 Jahren 0
Nicht ganz genau Bis zu einem gewissen Grad kann Git Bewegungen auch dann erkennen, wenn sich der Inhalt geändert hat. Ich habe irgendwo auf SO gelesen, dass Sie bis zu 50% der Datei ändern können, und Git erkennt sie immer noch als Umbenennung, und einige Befehlszeilenparameter können diesen Schwellenwert sogar erhöhen. Ich bin kein Git-Experte, aber das weiß ich. Tsahi Asher vor 5 Jahren 0
0
Mike Gonzales

Git wird dies nach dem Commit am Backend behandeln. Während Sie die nicht festgeschriebenen Dateien bearbeiten, werden die Erstellungs- und Löschvorgänge zunächst als separate Aktionen behandelt. Nach dem Festschreiben wird jedoch versucht, die Löschvorgänge mit create aufzulösen, um festzustellen, ob es sich tatsächlich nur um eine Dateiverschiebung handelt. Sie können dies im Commit-Protokoll mit den Meldungen "old file ==> new file" sehen, wenn git eine Verschiebung der Datei feststellt.

Alternativ können Sie git mv verwenden, wenn Sie sich sicherer fühlen https://git-scm.com/docs/git-mv