Zeichnen Sie den Dateikopiervorgang mit Git auf

Lesezeit: 5 Minuten

Wenn ich eine Datei in git mit git-mv verschiebe, zeigt der Status an, dass die Datei umbenannt wurde, und selbst wenn ich einige Teile ändere, wird sie immer noch als fast dasselbe angesehen (was gut ist, weil ich so den Verlauf verfolgen kann). .

Wenn ich eine Datei kopiere, hat die Originaldatei einen Verlauf, den ich mit der neuen Kopie verknüpfen möchte.

Ich habe versucht, die Datei zu verschieben und dann zu versuchen, sie am ursprünglichen Speicherort erneut auszuchecken. Nach dem Verschieben lässt mich Git den ursprünglichen Speicherort nicht mehr auschecken.

Ich habe versucht, eine Dateisystemkopie zu erstellen und dann die Datei hinzuzufügen – git listet sie als neue Datei auf.

Gibt es eine Möglichkeit, git dazu zu bringen, einen Dateikopiervorgang auf ähnliche Weise aufzuzeichnen, wie es eine Dateiumbenennung/-verschiebung aufzeichnet, bei der der Verlauf auf die Originaldatei zurückgeführt werden kann?

  • Sie sollten erwägen, Roberts Antwort zu akzeptieren. Es funktioniert perfekt.

    – EliadL

    17. August 2020 um 11:06 Uhr

Zeichnen Sie den Dateikopiervorgang mit Git auf
Jakub Narębski

Git führt weder Umbenennungs- noch Kopierverfolgung durch, was bedeutet, dass dies nicht der Fall ist Schallplatte umbenennen oder kopieren. Was es stattdessen tut, ist umbenennen und kopieren Erkennung. Sie können die Umbenennungserkennung in anfordern git diff (und git show) durch die Verwendung von -M Option können Sie eine zusätzliche Kopiererkennung in geänderten Dateien anfordern, indem Sie die verwenden -C Option stattdessen, und Sie können eine teurere Kopiererkennung für alle Dateien mit anfordern -C -C. Siehe die git-diff manpage.

-C -C impliziert -Cund -C impliziert -M.

-M ist eine Abkürzung für --find-renames, -C bedeutet --find-copies und -C -C kann auch so geschrieben werden --find-copies-harder.

Sie können Git auch so konfigurieren, dass die Umbenennungserkennung immer durch die Einstellung erfolgt diff.renames zu einem booleschen wahren Wert (zB true oder 1), und Sie können git anweisen, auch eine Kopiererkennung durchzuführen, indem Sie es auf setzen copy oder copies. Siehe die git-config manpage.

Überprüfen Sie auch die -l Option zu git diff und die zugehörige Konfigurationsvariable diff.renameLimit.


Beachten Sie, dass git log <pathspec> funktioniert in Git anders: hier <pathspec> ist ein Satz von Pfadbegrenzern, wobei Pfad ein (Unter-)Verzeichnisname sein kann. Es filtert und vereinfacht die Historie Vor Umbenennung und Kopiererkennung kommen ins Spiel. Wenn Sie Umbenennungen und Kopien verfolgen möchten, verwenden Sie git log --follow <filename> (was derzeit etwas eingeschränkt ist und nur für eine einzelne Datei funktioniert).

  • @allyourcode: Worüber bist du verwirrt? Um die Kopiererkennung standardmäßig einzuschalten, legen Sie fest diff.renames zu copies (z.B ‘git config diff.renames copies‘). Ich stimme zu, dass es ein bisschen kontraintuitiv ist.

    – Jakub Narębski

    25. Juli 2010 um 20:51 Uhr

  • Ein Abschnitt, den ich anscheinend nicht analysieren kann, ist “und Sie können standardmäßig auch die Umbenennungserkennung anfordern”. Wollen Sie sagen, dass es vier Werte gibt, die diff.renames verwenden kann (true, 1, kopieren, kopieren), und dass sie alle dasselbe tun?

    – Allourcode

    26. Juli 2010 um 2:43 Uhr

  • @allyourcode: Tut mir leid, das ist mir nicht aufgefallen. Jetzt behoben, danke.

    – Jakub Narębski

    26. Juli 2010 um 7:15 Uhr

  • @peschü: Git verwendet eine inhaltsadressierte Objektdatenbank als Repository-Speicher. Dateiinhalte werden in ‘Blob’-Inhalten unter einer Adresse gespeichert, die ein SHA-1-Hash des Inhalts ist (gut, Typ + Länge + Inhalt). Das bedeutet, dass bestimmte Inhalte nur einmal gespeichert werden. Nb. Diese automatische Deduplizierung war der Grund für die Erstellung des „bup“-Sicherungssystems unter Verwendung des Git-Pack-Formats.

    – Jakub Narębski

    23. November 2014 um 15:36 Uhr

  • Im Gegensatz zur folgenden Lösung funktioniert dies nicht mit der Änderungsverfolgung in einem Bereich. Git log erlaubt ein Range-Argument (git log -L123,456:file.xyz), die Umbenennungen korrekt folgt, aber nicht Kopien, und Sie können –follow in diesem Fall nicht übergeben; auch, AFAICT, das funktioniert nicht mit Git-Schuld.

    – Clemens

    10. Januar 2020 um 20:48 Uhr


1646156887 414 Zeichnen Sie den Dateikopiervorgang mit Git auf
Robert Pollack

Wenn Sie aus irgendeinem Grund nicht einschalten können Kopiererkennung wie in Jakub Narębskis Antwort, Sie können Gewalt Git, um den Verlauf der kopierten Datei in drei Commits zu erkennen:

  • Anstatt zu kopieren, wechseln Sie zu einem neuen Zweig und Bewegung die Datei dort an ihren neuen Speicherort.
  • Fügen Sie dort die Originaldatei erneut hinzu.
  • Führen Sie den neuen Branch mit der No-Fast-Forward-Option mit dem ursprünglichen Branch zusammen --no-ff.

Anerkennung an Raymond Chen. Was folgt, ist sein Verfahren. Angenommen, die Datei heißt origund Sie möchten, dass das Duplikat benannt wird apple:

git checkout -b dup # create and switch to branch

git mv orig apple # make the duplicate
git commit -m "duplicate orig to apple"

git checkout HEAD~ orig # bring back the original
git commit -m "restore orig"

git checkout - # switch back to source branch
git merge --no-ff dup # merge dup into source branch

19.05.2020: Die obige Lösung hat die Vorteile, dass sie das Log der Originaldatei nicht verändert, keinen Merge-Konflikt erzeugt und kürzer ist. Die frühere Lösung hatte vier Commits:

  • Anstatt zu kopieren, wechseln Sie zu einem neuen Zweig und Bewegung die Datei dort an ihren neuen Speicherort.
  • Wechseln Sie zum ursprünglichen Zweig und benennen Sie die Datei um.
  • Führen Sie den neuen Zweig mit dem ursprünglichen Zweig zusammen und lösen Sie den trivialen Konflikt, indem Sie beide Dateien behalten.
  • Stellen Sie den ursprünglichen Dateinamen in einem separaten Commit wieder her.

(Lösung von https://stackoverflow.com/a/44036771/1389680.)

  • Einfachheit, Kürze, 100% … Diese Antwort ist öffentlicher Dienst … alles in Sichtweite positiv zu bewerten

    – ptim

    11. November 2017 um 12:06 Uhr

  • Was ist der Unterschied zwischen move und rename?

    – Wowan

    28. März 2019 um 17:39 Uhr

  • Ich habe versucht, diesem (neuen) Rezept zu folgen, und es hat nicht funktioniert. Es könnte helfen, wenn Sie die tatsächlichen Befehle zeigen.

    – Greg Lindahl

    22. Juli 2020 um 7:15 Uhr

  • @RobertPollak Ich habe verschiedene Versionen davon ausprobiert, aber sie haben nicht funktioniert. Mit “Datei verschieben” meinst du git mv orig new? Mit “Lesen Sie das Original” meinen Sie cp new orig && git add orig?

    – ᅙᄉᅙ

    25. Juli 2020 um 6:00 Uhr


  • Die Idee, dass Sie einen Zweig erstellen, dort festschreiben und dann wieder zusammenführen müssen … und der oberste Kommentar lautet “Einfachheit und Kürze” … ist umwerfend. In Mercurial würdest du es einfach tun hg cp (oder hg cp -A wenn Sie es bereits selbst kopiert haben). Was für eine Schande, dass dieser Idiot den VCS-Beliebtheitswettbewerb gewonnen hat.

    – Arthur Tacca

    6. Februar 2021 um 11:07 Uhr

903320cookie-checkZeichnen Sie den Dateikopiervorgang mit Git auf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy