Câu hỏi Làm thế nào để lấy hash cho commit hiện tại trong Git?


Tôi muốn giữ lại (hiện tại) khả năng liên kết các biến đổi Git thành workitems được lưu trữ trong TFS.

Tôi đã viết một công cụ (sử dụng một cái móc từ Git), trong đó tôi có thể tiêm bộ nhận dạng công việc vào thông điệp của một bộ thay đổi Git.

Tuy nhiên, tôi cũng muốn lưu trữ mã định danh của cam kết Git (băm) vào một trường làm việc TFS tùy chỉnh. Bằng cách này tôi có thể kiểm tra một workitem trong TFS và xem những gì Git changesets được kết hợp với workitem.

Làm thế nào tôi có thể dễ dàng lấy băm từ cam kết hiện tại từ Git?


1418
2018-06-04 08:42


gốc




Các câu trả lời:


Để biến tham chiếu đối tượng mở rộng tùy ý thành SHA-1, chỉ cần sử dụng git-rev-parse, ví dụ

git rev-parse HEAD

hoặc là

git rev-parse --verify HEAD

Sidenote: Nếu bạn muốn quay tài liệu tham khảo (cành cây và thẻ) vào SHA-1, có git show-ref và git for-each-ref.


2073
2018-06-04 09:05



--verify ngụ ý rằng: The parameter given must be usable as a single, valid object name. Otherwise barf and abort. - Linus Unnebäck
git rev-parse --short HEAD trả về phiên bản ngắn của băm, chỉ trong trường hợp ai đó đang băn khoăn. - Thane Brimhall
Thêm vào những gì Thane nói, bạn cũng có thể thêm chiều dài cụ thể vào --short, nhu la --short=12, để có được một số chữ số cụ thể từ băm. - Tyson Phalp
@TysonPhalp: --short=N nói về tối thiểu số chữ số; git sử dụng số chữ số lớn hơn nếu số rút gọn sẽ không thể phân biệt được với các cam kết khác được rút ngắn. Hãy thử ví dụ: git rev-parse --short=2 HEAD hoặc là git log --oneline --abbrev=2. - Jakub Narębski
Thêm vào những gì Thane, Tyson và Jakub đã nói, bạn có thể in toàn bộ băm, nhưng đánh dấu các phần tử cần thiết để xác định màu xanh cam kết với git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD) - Zaz


Nếu bạn chỉ muốn băm rút gọn:

git log --pretty=format:'%h' -n 1

Hơn nữa, sử dụng% H là một cách khác để có được băm dài.


325
2017-09-30 23:32



Hoặc, có vẻ như, thêm - gửi đến lệnh rev-parse ở trên dường như hoạt động. - outofculture
Tôi nghĩ git log là sứ và git rev-parse là hệ thống ống nước. - Amedee Van Gasse
Một trong những lợi ích của phương pháp này là nó sẽ trả về phiên bản ngắn của băm với độ dài thích hợp được điều chỉnh cho các va chạm băm xảy ra cho các bản repos lớn hơn. Ít nhất là trong các phiên bản git gần đây. - Ilia Sidorenko
Đây là một cách xấu / không chính xác để làm điều đó bởi vì phương pháp này sẽ cung cấp cho bạn băm sai nếu bạn có một đầu tách rời. Ví dụ, nếu cam kết hiện tại là 12ab34 ... và cam kết trước đó là 33aa44 ... sau đó nếu tôi làm 'git checkout 33aa44' và sau đó tôi chạy lệnh của bạn, tôi sẽ vẫn nhận được trở lại 12ab34 ... mặc dù đầu của tôi thực sự chỉ đến 33aa44 ... - theQuestionMan
@ theQuestionMan Tôi không trải nghiệm hành vi bạn mô tả; git checkout 33aa44; git log -n 1 đưa cho tôi 33aa44. Bạn đang sử dụng phiên bản git nào? - outofculture


Một số khác, sử dụng git log:

git log -1 --format="%H"

Nó rất giống với @outofculture mặc dù ngắn hơn một chút.


116
2017-11-21 18:48



Và kết quả không được trích dẫn một lần. - crokusek


Để hoàn thiện, vì chưa có ai đề xuất nó. .git/refs/heads/master là một tệp chỉ chứa một dòng: hàm băm của lần commit mới nhất master. Vì vậy, bạn chỉ có thể đọc nó từ đó.

Hoặc, như lệnh:

cat .git/refs/heads/master

Cập nhật:

Lưu ý rằng git bây giờ hỗ trợ lưu trữ một số đầu refs trong tập tin gói ref thay vì như một tập tin trong / refs / heads / thư mục. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html


62
2017-10-16 11:34



Điều này giả định nhánh hiện tại là master, điều này không nhất thiết phải đúng. - gavrie
Thật. Đó là lý do tại sao tôi nói điều này là dành cho master. - Deestan
.git/HEAD thường chỉ vào một ref, nếu bạn có một SHA1 trong đó, bạn đang ở chế độ đầu tách ra. - eckes
Đây không phải là rất mạnh mẽ so với các phương pháp khác, đặc biệt bởi vì nó giả định rằng có một .git thư mục con, mà không nhất thiết phải là trường hợp. Xem --separate-git-dir gắn cờ trong git init trang người đàn ông. - jubobs
+1 vì đôi khi bạn không muốn cài đặt thực thi git (ví dụ: trong Dockerfile) - wim


Để nhận được toàn bộ SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

Để có được phiên bản rút gọn:

$ git rev-parse --short HEAD
cbf1b9a

58
2017-07-29 20:04





Luôn luôn có git describe cũng. Theo mặc định, nó cung cấp cho bạn -

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe 
release-0.19-11-g7a68a75

34
2017-08-26 10:43



Git mô tả trả về TAG đầu tiên có thể truy cập từ một cam kết. Làm thế nào điều này giúp tôi có được SHA? - Sardaukar
tôi thích git describe --long --dirty --abbrev=10 --tags nó sẽ cho tôi một cái gì đó như 7.2.0.Final-447-g65bf4ef2d4 là 447 commit sau thẻ 7.2.0.Final và 10 thông báo đầu tiên của SHA-1 toàn cầu tại HEAD hiện tại là "65bf4ef2d4". Điều này rất tốt cho các chuỗi phiên bản. Với --long nó sẽ luôn luôn thêm số (-0-) và băm, ngay cả khi thẻ xảy ra chính xác. - eckes
Nếu không có thẻ nào tồn tại thì git describe --always sẽ "hiển thị đối tượng cam kết viết tắt duy nhất là dự phòng" - Ronny Andersson


Cam kết băm

git show -s --format=%H

Chữ băm viết tắt được viết tắt

git show -s --format=%h

Nhấp chuột đây để biết thêm git show ví dụ.


25
2018-03-27 19:33





Sử dụng git rev-list --max-count=1 HEAD


24
2018-06-04 08:48



git-rev-list là về việc tạo danh sách các đối tượng cam kết; đó là git-rev-parse để dịch tên đối tượng (ví dụ: HEAD) thành SHA-1 - Jakub Narębski


Nếu bạn cần lưu trữ băm trong một biến trong một tập lệnh, bạn có thể sử dụng

last_commit=$(git rev-parse HEAD)

Hoặc, nếu bạn chỉ muốn 10 ký tự đầu tiên (như github.com)

last_commit=$(git rev-parse HEAD | cut -c1-10) 

18
2017-07-15 16:04



Ngoài ra còn có --short hoặc là --short=number tham số cho git rev-parse; không cần phải sử dụng một đường ống và cut. - Julian D.