2011-12-23 11 views
35

Co to jest najprostszy jednolinijkowy, aby uzyskać ostatnią datę zatwierdzenia dla wielu plików w repozytorium Git (tj. Dla każdego pliku, data ostatniego zatwierdzenia, które zmieniło ten plik)?Jak uzyskać ostatnią datę zatwierdzenia dla kilku plików w Git?

W tym celu używam innych poleceń Basha, aby znaleźć długą listę plików spełniających pewne kryteria, a chciałbym po prostu przesłać tę listę do komendy Git, aby uzyskać ostatnią datę zatwierdzenia dla każdego plik.

+0

Czy kiedykolwiek byłeś w stanie stworzyć alias git lub cokolwiek zrzucił daty zatwierdzenia wielu plików? Mam folder nadrzędny z plikami i folderami/plikami itp. Chcę zobaczyć, jak ostatnio zmieniło się coś w tym folderze. – Terry

Odpowiedz

60

Poniższa komenda będzie pomocne:

git log -1 --format=%cd filename.txt 

To będzie drukować ostateczny termin zmiany na jednym pliku. -1 pokazuje jeden wpis dziennika (najnowszy), a --format=%cd pokazuje datę zatwierdzenia. Zapoznaj się z dokumentacją dla git-log, aby uzyskać pełny opis opcji.

Powinieneś być w stanie łatwo rozszerzyć to dla grupy plików.

+1

Jest to pomocne. Czy istnieje lepszy sposób dołączenia nazwy każdego pliku do daty niż coś takiego jak: 'dla x w $ (niektóre-polecenie); do echo $ x $ (git log -1 - format =% cd $ x); zrobione "? – jonderry

+0

Nie sądzę, ponieważ wszystkie kody formatujące '%' odnoszą się do * commit * zamiast indywidualnego * pliku *. "echo" może być najbardziej prostą drogą. –

+3

Warto zwrócić uwagę, że '% ci' wyprowadza sformatowane daty ISO (ish); więc możesz je sortować. Również '% ai' wypisuje datę autora, a nie datę autora. –

8

Lekko przedłużając odpowiedź Grega, git log może przyjąć wiele ścieżek w swojej argumentacji. Pokaże wtedy tylko zatwierdzenia, które zawierały te ścieżki. Dlatego, aby uzyskać najnowsze zobowiązać do grupy plików:

git log -1 --format=%cd -- fileA.txt fileB.txt fileC.txt 

Jestem całkiem śmieci w skryptów powłoki, więc nie jestem do końca pewien, jak skonstruować tego polecenia za pośrednictwem rurociągów, ale może to byłoby dobry temat na kolejne pytanie.

+2

Tak, ale to zwraca ostatnie zatwierdzenie spośród wszystkich zatwierdzonych plików, zamiast ostatniego zatwierdzenia * dla każdego pliku *. – Cameron

+0

To działa, ale niestety nie w środowisku TravisCI. Kiedy TravisCI klonuje repo wszystkie daty plików są datą i czasem klonu (dziś/teraz), a nie datą i godziną tego, co jest w repozytorium. Bardzo frustrujące. – MitchellK

+0

Zrobiłem problem z TravisCI o tym tutaj, jeśli ktoś jest zainteresowany> https://github.com/travis-ci/travis-ci/issues/8539 – MitchellK

1

Oto jeden liner użyciu find (podzielone na kilka dla czytelności, ale dzięki ukośniki tylny copy-paste powinno działać):

find <dirs...> -name '<pattern>' <any other predicate to get what you want> \ 
    -exec git log -1 --format="AAA%ai NNN" '{}' \; \ 
    -exec echo '{}' XXX \; \ 
| tr \\n N | sed -e 's/AAA/\n/g' | sed -e 's/NNNN/ /g' -e 's/XXX.*//g' 

nadmiernie skomplikowany przełamane maglowania z tr i sed jest tylko tam aby uzyskać datę i nazwę pliku w jednym wierszu oraz aby zignorować niepotwierdzone pliki. Musisz się upewnić, że żaden z twoich plików nie zawiera tych głupich znaczników AAA XXX NNNN.

Powiązane problemy