2011-12-23 31 views
35

Cách đơn giản nhất để lấy ngày cam kết cuối cùng cho một loạt tệp trong kho lưu trữ Git (tức là, đối với mỗi tệp, ngày cam kết cuối cùng đã thay đổi tệp đó)? Bối cảnh cho điều này là tôi đang sử dụng các lệnh Bash khác để tìm một danh sách dài các tệp phù hợp với một số tiêu chí và tôi muốn chỉ đưa danh sách này vào một lệnh Git để có được ngày cam kết cuối cùng cho mỗi tập tin.Làm thế nào để có được ngày cam kết cuối cùng cho một loạt các tập tin trong Git?

+0

Bạn có bao giờ có thể tạo bí danh git hoặc bất kỳ điều gì có thể loại bỏ ngày cam kết của nhiều tệp không? Tôi có một thư mục cha với các tập tin và thư mục/tập tin, vv Tôi muốn xem thời gian qua bất cứ điều gì trong thư mục đó thay đổi. – Terry

Trả lời

60

Lệnh sau sẽ rất hữu ích:

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

này sẽ in ngày thay đổi mới nhất cho một tập tin. -1 hiển thị một mục nhập nhật ký (lần gần nhất) và --format=%cd hiển thị ngày cam kết. Xem tài liệu cho git-log để biết mô tả đầy đủ về các tùy chọn.

Bạn sẽ có thể dễ dàng mở rộng nhóm này cho một nhóm tệp.

+1

Điều này hữu ích. Có cách nào tốt hơn để đính kèm tên của mỗi tập tin vào ngày hơn một cái gì đó như sau: 'cho x trong $ (một số lệnh); echo $ x $ (git log -1 - format =% cd $ x); done'? – jonderry

+0

Tôi không nghĩ như vậy, vì tất cả các mã định dạng '%' tham chiếu đến * commit * chứ không phải là tệp * riêng lẻ *. 'echo' có thể là cách đơn giản nhất ở đó. –

+3

Giá trị chỉ ra rằng '% ci' xuất ra ngày định dạng ISO (ish); để bạn có thể sắp xếp chúng. Ngoài ra '% ai' sẽ xuất ra ngày tác giả, thay vì ngày bắt đầu. –

8

Hơi mở rộng câu trả lời của Greg, git log có thể thực hiện nhiều đường dẫn trong đối số của nó. Sau đó, nó sẽ chỉ hiển thị các cam kết bao gồm các đường dẫn đó. Vì vậy, để có được cam kết mới nhất cho một nhóm các tập tin:

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

Tôi rác khá ở kịch bản vỏ, vì vậy tôi không chắc chắn chính xác làm thế nào để xây dựng lệnh đó thông qua đường ống, nhưng có lẽ đó sẽ là một chủ đề tốt cho một câu hỏi khác.

+2

Vâng, nhưng điều đó trả về cam kết mới nhất trong số tất cả các cam kết của các tệp, thay vì cam kết mới nhất * cho mỗi tệp *. – Cameron

+0

Điều này hoạt động nhưng đáng buồn là không phải bên trong một môi trường TravisCI. Khi TravisCI nhân bản repo, tất cả các ngày tháng đều là ngày và thời gian của bản sao (hôm nay/bây giờ) và không phải ngày và thời gian của những gì có trong repo. Rất bực bội. – MitchellK

+0

Tôi đã đăng sự cố với TravisCI về vấn đề này tại đây nếu có ai khác quan tâm> https://github.com/travis-ci/travis-ci/issues/8539 – MitchellK

1

Dưới đây là một liner sử dụng find (chia thành nhiều để có thể đọc, nhưng nhờ vào những dấu xồ nguợc dấu, copy-paste nên làm việc):

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' 

Các newline quá phức tạp mangling với tr và sed là chỉ có để lấy ngày và tên tệp trên một dòng và bỏ qua các tệp không được theo dõi. Bạn phải đảm bảo rằng không có tệp nào của bạn chứa các dấu hiệu ngớ ngẩn đó AAA XXX NNNN.

Các vấn đề liên quan