Làm thế nào để tham khảo các cam kết ban đầu?


131

Tôi đã có một tập lệnh cần tham chiếu cam kết ban đầu trong kho lưu trữ. git có tài liệu tham khảo đặc biệt HEAD, nhưng không có tương ứng TAIL. Tôi không thể tìm thấy bất cứ điều gì trong git help rev-parseđó dường như sẽ giúp tôi.

Đây là những gì tôi muốn làm:

git show TAIL

Đây là một lựa chọn tôi có:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

Điều đó khá khó khăn và phụ thuộc vào đầu ra của nhật ký git không thay đổi.

Ngay bây giờ tôi chỉ cần gắn thẻ cam kết ban đầu và sử dụng nó làm refspec của tôi. Tuy nhiên, tôi muốn phát hành một công cụ chung, vì vậy đó không phải là một lựa chọn tuyệt vời.

Câu trả lời:


151

Không sử dụng git-log để viết kịch bản: sử dụng git-rev-listhoặc git-logvới định dạng tùy chỉnh được chỉ định ( --format=*<sth>*tùy chọn).

Có một vấn đề khác với câu hỏi của bạn: có thể tồn tại nhiều hơn một cam kết gốc TAIL như vậy (cam kết không cha mẹ) trong kho lưu trữ (ngay cả khi chúng tôi giảm giá các nhánh bị ngắt kết nối, chẳng hạn như 'html', 'man' và 'todo' trong git.git kho). Đây thường là kết quả của việc tham gia các dự án riêng biệt trong một hoặc sử dụng hợp nhất phụ của các tiểu dự án được phát triển riêng.

Ví dụ: kho git có 6 xác nhận gốc: git-gui, gitk (hợp nhất phụ), gitweb (được hợp nhất, không còn được phát triển riêng), các công cụ thư git (được sáp nhập rất sớm trong lịch sử dự án) và xuất khẩu nhanh p4 ( có lẽ vô tình). Đó là không tính các gốc của các nhánh 'html và' man ', các nhánh "tiện lợi" có chứa tài liệu được tạo trước và nhánh' việc cần làm 'với danh sách và tập lệnh TODO.


Nếu bạn có git 1.7.4.2 hoặc mới hơn, bạn có thể sử dụng --max-parentstùy chọn:

$ git rev-list --max-parents=0 HEAD

Mặt khác, bạn có thể nhận được danh sách tất cả các xác nhận không có cha mẹ (root) có thể truy cập từ chi nhánh hiện tại bằng cách sử dụng:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Đối với tôi, git rev-list HEAD | tail -n 1git rev-list --max-parents=0 HEADkhông trả lại cùng giá trị băm cho tôi. Người sử dụng --max-parents=0thực tế là nhận được cam kết ban đầu. Chỉ cần nghĩ rằng tôi sẽ chỉ ra rằng sau này có vẻ đáng tin cậy hơn.
jbranchaud

1
@Treebranch điều này có thể xảy ra nếu bạn có các cam kết với dấu thời gian lẻ. Thêm --topo-ordervào rev-listnên sửa nó, mặc dù tôi nghĩ rằng --max=parents=0câu trả lời là tốt nhất.
jthill

35

git rev-list HEAD | tail -n 1 là một lựa chọn ổn định hơn.


14
Điều này sẽ trả lại một trong những cam kết đuôi; có thể có nhiều hơn một cam kết (không có cha mẹ)
Jakub Narębski

Câu trả lời này hoạt động hoàn hảo và chỉ trả lại một cam kết trong khi git rev-list --max-parents=0 HEADtrả lại 3 lần cam kết.
protoEveachion

tail cũng không phải là một lệnh theo mặc định trong windows - mặc dù nó hoạt động trong GitBash trên windows. :)
Johny Skovdal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.