Git là một hệ thống kiểm soát phiên bản phân tán, vì vậy bạn phải xác định cẩn thận "ngày đẩy" nghĩa là gì. Ví dụ: giả sử người dùng A đẩy một số cam kết vào kho lưu trữ của người dùng B. Một lúc sau, người dùng B đẩy những cam kết tương tự đó vào kho lưu trữ thứ ba. Bạn quan tâm đến ngày nào?
Tôi đang suy đoán rằng bạn có một kho lưu trữ được chia sẻ và muốn người dùng của kho lưu trữ được chia sẻ đó có thể xác định thời điểm một cái gì đó được xuất bản lên kho lưu trữ. Nếu điều đó đúng, bạn sẽ phải thu thập thông tin đó trong kho lưu trữ được chia sẻ.
Các tin xấu
Thật không may, không có cách nào để thêm ngày vào các thông báo cam kết. Điều đó sẽ thay đổi ID cam kết (là hàm băm SHA1 của nội dung), gây ra tất cả các loại vấn đề.
Tin tốt
May mắn thay, Git có một tính năng (tương đối mới) được gọi là ghi chú . Tính năng này cho phép bạn đính kèm văn bản tùy ý vào các cam kết, git log
có thể hiển thị. Ghi chú có thể được chỉnh sửa và chia sẻ với những người khác.
Bạn có thể sử dụng tính năng ghi chú để đính kèm thông báo "cam kết này đã được nhận vào [ngày]" vào mỗi cam kết khi nó được nhận bởi kho lưu trữ được chia sẻ.
Xem git help notes
để biết chi tiết.
Cách ghi ngày
Đây là cách tiếp cận tôi khuyên bạn nên:
- Sửa đổi
post-receive
hook trên kho lưu trữ được chia sẻ của bạn để hướng dẫn từng cam kết mới có thể truy cập cho mỗi tham chiếu được cập nhật.
Đối với mỗi cam kết, hãy thêm một cái gì đó như "[người dùng] của [repository_url] đã thêm cam kết này vào [ref] vào [date]" vào ghi chú của cam kết.
Bạn có thể muốn sử dụng một tham chiếu ghi chú dành riêng cho mục đích này (như refs/notes/received-on
) thay vì mặc định refs/notes/commits
. Điều này sẽ ngăn chặn xung đột với các ghi chú được tạo cho các mục đích khác.
- Sửa đổi
receive
hook của bạn để từ chối cập nhật đối với tham chiếu ghi chú của bạn (để ngăn người dùng vô tình hoặc cố ý làm rối các ghi chú).
Yêu cầu tất cả người dùng chạy các lệnh sau từ bên trong cây làm việc của họ:
# Fetch all notes from the shared repository.
# Assumes the shared repository remote is named 'origin'.
git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
# Show all notes from the shared repository when running 'git log'
git config --add notes.displayRef 'refs/remote-notes/origin/*'
Bước này là cần thiết vì Git bỏ qua các tham chiếu không phải nhánh, không phải thẻ trong kho lưu trữ ngược dòng theo mặc định.
Ở trên giả định rằng các tham chiếu chỉ là nâng cao, không bao giờ bị xóa hoặc buộc cập nhật. Có thể bạn sẽ muốn post-receive
hook cũng thêm ghi chú "đã xóa vào [date]" để xử lý những trường hợp này.
git reflog --date=local origin/master
(lưu ýorigin/
) để xem danh sách các lần đẩy. Nếu không, chỉ có cam kết, kiểm tra và kéo mới có trong danh sách (điều này cũng hữu ích). Trên thực tế, tôi đã được chỉ ra nó bởi câu trả lời của @ JonathanDay .