Ich habe ein Git-Repository mit n Commits.
Ich habe eine Datei, die ich brauche und die sich früher im Repository befand und die ich plötzlich suche und denke: "Oh! Wo ist diese Datei geblieben?"
Gibt es eine (Reihe von) Git-Befehlen, die mir sagen, dass "Datei wirklich_needed.txt bei Commit n-13 gelöscht wurde"?
Mit anderen Worten, ohne jedes einzelne Commit zu betrachten und zu wissen, dass mein Git-Repo jede Änderung jeder Datei enthält, kann ich schnell das letzte Commit finden, das diese Datei enthält, damit ich es zurückerhalten kann?
Antworten:
git log --full-history -- [file path]
Zeigt die Änderungen einer Datei an, funktioniert auch dann, wenn die Datei gelöscht wurde.Beispiel:
Wenn Sie nur das letzte Commit sehen möchten, bei dem eine Datei gelöscht wurde, verwenden Sie zusätzlich -1, z.
git log --full-history -1 -- [file path]
Siehe Welches Commit hat eine Datei gelöscht?
quelle
git log -- */<<filename>>.<<file extension>>
nicht den gesamten Dateipfad kannte.Kurze Antwort:
zeigt Ihnen alle Commits in der Geschichte Ihres Repos, einschließlich der berührten Merge-Commits
your_file
. Der letzte (oberste) hat die Datei gelöscht.Einige Erklärungen:
Die
--full-history
Flagge hier ist wichtig. Ohne diese Funktion führt Git eine "Vereinfachung des Verlaufs" durch, wenn Sie nach dem Protokoll einer Datei fragen. Die Dokumente enthalten nur wenige Details darüber, wie dies genau funktioniert, und mir fehlt der Mut, um es aus dem Quellcode herauszufinden, aber die Git-Log-Dokumente haben so viel zu sagen:Dies betrifft natürlich, wann die Datei, deren Verlauf wir möchten, gelöscht wird , da der einfachste Verlauf, der den Endzustand einer gelöschten Datei erklärt, kein Verlauf ist . Besteht das Risiko, dass
git log
ohne--full-history
einfach behauptet wird, dass die Datei nie erstellt wurde? Leider ja. Hier ist eine Demonstration:Beachten Sie, dass
git log -- bar
im obigen Terminal-Dump buchstäblich keine Ausgabe ausgegeben wurde. Git "vereinfacht" die Geschichte zu einer Fiktion, in der es siebar
nie gab.git log --full-history -- bar
Auf der anderen Seite erhalten wir das Commit, das erstellt wurde,bar
und das Commit, das es gelöscht hat.Um es klar auszudrücken: Dieses Thema ist nicht nur theoretisch. Ich habe nur in die Dokumente geschaut und das
--full-history
Flag entdeckt, weilgit log -- some_file
es für mich in einem echten Repository fehlgeschlagen ist, in dem ich versucht habe, eine gelöschte Datei aufzuspüren. Geschichte Vereinfachung könnte manchmal hilfreich sein , wenn Sie zu verstehen , sind versucht , wie eine derzeit bestehende Datei in seinem aktuellen Zustand sein kam, aber wenn Sie eine Datei auf die Spur zu versuchen Löschung es wahrscheinlicher ist , Sie versteckt schrauben über die verpflichten Sie kümmern sich um . Verwenden Sie--full-history
für diesen Anwendungsfall immer das Flag.quelle
git log
Ausgabe selbst geht jedoch nicht hervor, dass das letzte Commit die Datei gelöscht hat . Ich habe es auch versuchtgit log --name-status --full-history -- file_name
undgit log -p --stat --full-history -- file_name
, aber keiner weist ausdrücklich darauf hin, dass die Datei beim letzten Festschreiben entfernt wurde. Dies scheint ein Fehler zu sein.mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- bar
enthältD bar
undA bar
für mich in der Protokollausgabe mit Git 2.12.2. Sehen Sie diese Zeilen nicht in der Ausgabe? Welche Version hast du?git version 2.15.1
Ja, Ihre Befehlssequenz meldetD bar
undA bar
. Vielleicht ist mein Problem speziell auf den Verlauf meiner Datei zurückzuführen. Ich habe den Verlauf einer.htaccess
Datei verfolgt, die gitignoreed und entfernt wurde. Ich habe das endlich herausgefunden und die Datei wieder hinzugefügt. Wenn ich--name-status
in dengit log
Befehl einbinde, werden zweiA .htaccess
Einträge angezeigt (da ich sie beim letzten Festschreiben wieder hinzugefügt habe), aber neinD .htaccess
. In einigen Fällen scheintgit log
ein expliziterD file_name
Eintrag nicht angezeigt zu werden, obwohl eine Datei aus dem Repository entfernt wurde ..htaccess
in einem Commit X hinzugefügt wurde, aber dann nicht in dem Merge-Commit enthalten ist, das X auf den Master gebracht hat. Das ist das einzige , was ich mir vorstellen kann , dass ich möglicherweise könnte argumentieren , sollte wie eine Datei suchen hinzugefügt wurde und nie gelöscht und doch noch nicht vorhanden ist. Es wäre interessant zu versuchen, eine MCVE herauszufinden und dann herauszufinden, ob es sich um einen Git-Fehler handelt, und wenn nicht, ob es möglich ist, meine Antwort zu optimieren, um Ihren Fall zu behandeln.Git-Protokoll, aber Sie müssen dem Pfad ein Präfix voranstellen
--
Z.B:
quelle
Ich habe hier gerade eine Lösung hinzugefügt (gibt es in git eine Möglichkeit, alle gelöschten Dateien im Repository aufzulisten ?) , Um die Commits gelöschter Dateien mithilfe eines regulären Ausdrucks zu ermitteln:
Dies gibt alles zurück, was in einem Verzeichnis mit dem Namen
some_dir
(Cascading) gelöscht wurde . Jeder sed regexp dort, wo es\/some_dir\/
ist, wird tun.OSX (danke an @triplee und @keif)
quelle
sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
sed
ist anscheinend nicht immer gut mit Semikolons als Befehlstrennzeichen. Versuchen Sie, sie in Zeilenumbrüche umzuwandeln, oder wechseln Sie zused -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
für mich unter OSX gearbeitet.Sie finden das letzte Commit, das die Datei gelöscht hat, wie folgt:
Weitere Informationen finden Sie hier
quelle
Versuchen:
quelle