Git deposundaki tüm dosyaların son değişiklik tarihi nasıl alınır?


64

Git deposundaki tek bir dosyanın son değişiklik tarihini nasıl alacağımı biliyorum:

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

Depoda bulunan tüm dosyalar için aynı işlemi yapmanın basit ve etkili bir yolu var mı?

Yanıtlar:


74

Basit bir cevap, her bir dosya üzerinde yineleme yapmak ve değişiklik zamanını görüntülemek, yani:

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

Bu, şöyle bir çıktı verecektir:

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

Açıkçası, bu noktada sadece bash betiğinden beri bunu kontrol edebilirsiniz - bu nedenle kalbinizin içeriğine göre kişiselleştirmekten çekinmeyin!


2
Tek bir git günlüğü çalışmasında birleştirilmiş bir çıktı elde etmek için bir seçenek olduğunu umuyordum, ancak cevabınız bul kullanarak düşündüğümden daha iyi. Yalnızca depoda depolanan dosyaları listeleme, .git klasörünü atlama ve dosyaları yok sayma avantajına sahip olan git-ls-tree'i bilmiyordum. Teşekkürler.
Eric Bréchemier

Sorun değil, Eric; aynı rotayı takip ediyorsun - yani, bir bulucu yapıyor ve .git dizinini görmezden geliyorsun! :) Git sıhhi tesisat komutlarını kullanarak bazı seçenekler olabilir, ama açıkçası, bu oldukça iyi çalışıyor. Bilgiyi her seferinde dosya bazında elde etmenin bir yolunu bulabilirseniz, bunun en iyi işe yaradığını - ancak unutma, git tek tek dosyaların durumunu değil, taahhüt durumuyla çalışır.
Andrew M.,

11
İnsan tarafından okunabilir tarihler yerine sıralanabilir zaman damgaları istiyorsanız --format = "% ai" kullanmanızı öneririm.
ThorSummoner

2
"HEAD" sadece bir referans olduğundan, istediğiniz bir referansı kullanabilirsiniz, etiket, dal, karma işlem vb.
Andrew M.

1
@ThorSummoner'ın dediği gibi, tarih için% ai formatını kullanın ve sonuçları sıralamak için sadece pipo yapın:git ls-tree -r --name-only HEAD | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort
John Hunt

21

Bu yaklaşım ayrıca boşluk içeren dosya adlarıyla da çalışır:

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

Örnek çıktı:

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

Çıktı | sort, sonuna kadar eklenerek değişiklik zaman damgasına göre sıralanabilir :

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

Bu değişiklik zaman damgası göre sıralanmış almak için herhangi bir yolu?
Amelio Vazquez-Reina,

1
@ AmelioVazquez-Reina: Sadece ekleyelim | komutun sonuna göre sıralayın.
dotancohen

2
Bu işe yarıyor ama uzun zaman alıyor ...
Guillochon

5

Bu Andrew M.'nin cevabının ufak bir uyarısı. (Cevabı hakkında yorum yapamadım.)

İlk $ dosya adını , gömülü boşluklu dosya adlarını desteklemek için çift ​​tırnak içine alın.

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

Örnek çıktı:

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

Andrew'un ( ls-tree'e dayanan) çözümünün çıplak depolarla çalıştığını takdir ediyorum ! (Bu, ls dosyalarını kullanan çözümler için doğru değildir.)


Ayrıca yankıyı da atlayabilirsiniz: git log -1 --format = "% ad $ dosyaadı"
Kevin Lyda

0

İşte balık kullananlar için Andrew M'in cevabının balık kabuğu versiyonu.

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

Bunu kolay erişim için bir balık işlevi olarak saklıyorum.


0

Windows ve PowerShell kullananlar için, Andrew M'in cevabı, bilgisayar tarafından okunabilir ince ayarıyla:

git ls-tree -r --name-only HEAD | ForEach-Object { "$(git log -1 --format="%ai" -- "$_")`t$_" }

Örnek çıktı:

2019-05-07 12:00:37 -0500   .editorconfig
2016-07-13 14:03:49 -0500   .gitattributes
2019-05-07 12:00:37 -0500   .gitignore
2018-02-03 22:01:17 -0600   .mailmap
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.