Frage So rufen Sie das letzte Änderungsdatum aller Dateien in einem Git-Repository ab


Ich weiß, wie man das letzte Änderungsdatum einer einzelnen Datei in einem Git-Repository abruft:

git log -1 --format="%ad" -- path/to/file

Gibt es eine einfache und effiziente Möglichkeit, das gleiche für alle Dateien zu tun, die derzeit im Repository vorhanden sind?


49
2018-06-22 19:41


Ursprung




Antworten:


Eine einfache Antwort wäre, jede Datei zu durchlaufen und ihre Änderungszeit anzuzeigen, d. H .:

git ls-tree -r --name-only HEAD | while read filename; do
  echo "$(git log -1 --format="%ad" -- $filename) $filename"
done

Dies ergibt eine Ausgabe wie folgt:

Fri Dec 23 19:01:01 2011 +0000 Config
Fri Dec 23 19:01:01 2011 +0000 Makefile

Natürlich können Sie das kontrollieren, da es an dieser Stelle nur ein Bash-Skript ist - Sie können es also nach Herzenslust anpassen!


60
2018-06-22 20:10



Ich hatte gehofft, dass es eine Option gibt, um eine kombinierte Ausgabe in einem einzigen Lauf von git log zu erhalten, aber Ihre Antwort ist besser als die, die ich mit find im Sinn hatte. Ich kannte git-ls-tree nicht, was den Vorteil hat, nur die im Repository gespeicherten Dateien aufzulisten, den .git-Ordner und die ignorierten Dateien zu überspringen. Vielen Dank. - Eric Bréchemier
Kein Problem, Eric. Sie folgen dem gleichen Weg, den ich gemacht habe - d. h. eine Suche durchführen und das .git-Verzeichnis ignorieren! :) Es kann einige Optionen geben, die die Git-Installationsbefehle verwenden, aber ehrlich gesagt funktioniert das ziemlich gut. Wenn Sie einen Weg finden könnten, die Informationen auf einer Dateibasis auf einmal zu erhalten, würde das am besten funktionieren - aber denken Sie daran, dass git den Zustand der Commits und nicht den Zustand der einzelnen Dateien anwendet. - Andrew M.
Kann dies angepasst werden, um an einem anderen Commit als dem aktuellen Checkout HEAD zu arbeiten? Ich denke, der Log-Befehl arbeitet hier standardmäßig relativ zum HEAD. - ThorSummoner
Ich empfehle die Verwendung von --format = "% ai", wenn Sie sortierbare Zeitstempel anstelle von menschenlesbaren Daten möchten. - ThorSummoner
Da "HEAD" nur eine Referenz ist, können Sie jede beliebige Referenz verwenden, sei es ein Tag, eine Verzweigung, einen Hash-Code, etc. - Andrew M.


Dieser Ansatz funktioniert auch mit Dateinamen, die Leerzeichen enthalten:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {}

Beispielausgabe:

2015-11-03 10:51:16 -0500 .gitignore
2016-03-30 11:50:05 -0400 .htaccess
2015-02-18 12:20:26 -0500 .travis.yml
2016-04-29 09:19:24 +0800 2016-01-13-Atlanta.md
2016-04-29 09:29:10 +0800 2016-03-03-Elmherst.md
2016-04-29 09:41:20 +0800 2016-03-03-Milford.md
2016-04-29 08:15:19 +0800 2016-03-06-Clayton.md
2016-04-29 01:20:01 +0800 2016-03-14-Richmond.md
2016-04-29 09:49:06 +0800 3/8/2016-Clayton.md
2015-08-26 16:19:56 -0400 404.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-bradycardia-algorithm.htm
2015-12-23 17:03:51 -0500 _algorithms/acls-pulseless-arrest-algorithm-asystole.htm
2016-04-11 15:00:42 -0400 _algorithms/acls-pulseless-arrest-algorithm-pea.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-secondary-survey.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-suspected-stroke-algorithm.htm
2016-03-31 11:54:19 -0400 _algorithms/acls-tachycardia-algorithm-stable.htm
...

Die Ausgabe kann nach Modifikationszeitstempel durch Hinzufügen sortiert werden | sort bis zum Ende:

git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format="%ai {}" {} | sort

14
2018-05-03 15:35



Irgendeine Möglichkeit, dies nach Modifikationszeitstempel zu sortieren? - Amelio Vazquez-Reina
@ AmelioVazquez-Reina: Einfach hinzufügen `| Sortiere an das Ende des Befehls. - dotancohen
Das funktioniert aber dauert eine loooong Zeit ... - Guillochon


Dies ist eine kleine Verbesserung der Antwort von Andrew M. (Ich konnte seine Antwort nicht kommentieren.)

Wickeln Sie den ersten $ -Dateinamen in doppelte Anführungszeichen, um Dateinamen mit eingebetteten Leerzeichen zu unterstützen.

git ls-tree -r --name-only HEAD | while read filename; do
    echo "$(git log -1 --format="%ad" -- "$filename") $filename"
done

Beispielausgabe:

Tue Jun 21 11:38:43 2016 -0600 subdir/this is a filename with spaces.txt

Ich schätze, dass Andrews Lösung (basierend auf ls-Baum) arbeitet mit nackten Repositories! (Dies gilt nicht für Lösungen, die ls-Dateien verwenden.)


2
2018-06-21 18:15



Sie können das Echo auch überspringen: git log -1 --format = "% ad $ filename" - Kevin Lyda


Hier ist die Fischschalenversion von Andrew Ms Antwort für diejenigen, die Fisch verwenden.

git ls-tree -r --name-only HEAD | while read -l filename
    printf '%s %s\n' (git log -1 --format="%ai" -- $filename) $filename
end

Ich speichere dies als Fischfunktion für den einfachen Zugriff.


0
2018-03-09 16:28