Vraag Hoe de laatste wijzigingsdatum van alle bestanden in een git-repository op te halen


Ik weet hoe ik de laatste wijzigingsdatum van een enkel bestand in een git-repository ophaal:

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

Is er een eenvoudige en efficiënte manier om hetzelfde te doen voor alle bestanden die momenteel in de repository aanwezig zijn?


49
2018-06-22 19:41


oorsprong




antwoorden:


Een eenvoudig antwoord zou zijn om elk bestand te doorlopen en de modificatietijd ervan weer te geven, dat wil zeggen:

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

Dit levert de output op als:

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

Vanzelfsprekend kun je dit besturen, omdat het op dit moment slechts een bash-script is - dus voel je vrij om naar hartelust aan te passen!


60
2018-06-22 20:10



Ik hoopte dat er een optie was om een ​​gecombineerde output te krijgen in een enkele run van git log, maar je antwoord is beter dan degene die ik in gedachten had met find. Ik kende git-ls-tree niet, wat als voordeel heeft dat alleen de bestanden in de repository worden vermeld, de .git-map en genegeerde bestanden worden overgeslagen. Bedankt. - Eric Bréchemier
Geen probleem, Eric; je volgt dezelfde route die ik deed - d.w., een zoekopdracht uitvoeren en de .git-map negeren! :) Er kunnen enkele opties zijn met behulp van de git loodgietersopdrachten, maar eerlijk gezegd werkt dit vrij goed. Als je een manier zou kunnen vinden om de informatie per bestand in één keer te krijgen, zou dat het beste werken - maar denk eraan, git werkt op de staat van commits, niet op de staat van individuele bestanden. - Andrew M.
Kan dit worden aangepast om te werken aan een andere commit dan de huidige kassa HEAD? Ik denk dat de log-opdracht hier standaard werkt ten opzichte van de HEAD. - ThorSummoner
Ik raad aan om de --format = "% ai" te gebruiken als u sorteerbare tijdstempels wilt in plaats van menselijke leesbare datums. - ThorSummoner
Omdat "HEAD" slechts een referentie is, kunt u elke gewenste referentie gebruiken, of het nu een tag, branch, commit hash, enz. Is. - Andrew M.


Deze aanpak werkt ook met bestandsnamen die spaties bevatten:

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

Voorbeelduitvoer:

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
...

De uitvoer kan op tijdstempel worden gesorteerd door toevoeging | sort naar het einde:

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

14
2018-05-03 15:35



Elke manier om dit te sorteren gesorteerd op tijdstempel wijziging? - Amelio Vazquez-Reina
@ AmelioVazquez-Reina: voeg gewoon `| sort` naar het einde van het commando. - dotancohen
Dit werkt maar duurt lang ... - Guillochon


Dit is een kleine tweak van Andrew M.'s antwoord. (Ik kon geen commentaar geven op zijn antwoord.)

Wikkel de eerste $ bestandsnaam in dubbele aanhalingstekens, om bestandsnamen met ingesloten ruimten te ondersteunen.

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

Voorbeelduitvoer:

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

Ik waardeer de oplossing van Andrew (gebaseerd op ls-tree) werkt met bare repositories! (Dit is niet waar voor oplossingen met ls-bestanden.)


2
2018-06-21 18:15



Je kunt ook de echo overslaan: git log -1 --format = "% ad $ filename" - Kevin Lyda


Hier is de versie van de vis van Andrew M's antwoord, voor degenen die vis gebruiken.

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

Ik bewaar dit als een visfunctie voor gemakkelijke toegang.


0
2018-03-09 16:28