รายการแท็ก Git แสดงแฮช sha1 คอมมิต


107

ดังนั้น git tagคำสั่งจะแสดงรายการแท็ก git ปัจจุบัน

tag1
tag2

git tag -n พิมพ์ข้อความของแท็ก

tag1  blah blah
tag2  blah blah

วิธีที่ดีที่สุดในการรับแฮชของ tag1 & tag2 คืออะไร


1
ไม่ใช่คำถามที่ฉันคิดว่าจะถามแยกกัน แต่ฉันสงสัยว่าทำไมgit tag( -nหรือตัวเลือกอื่น ๆ ... ) ไม่แสดงแฮชคอมมิตตั้งแต่แรก เป็นเรื่องดีที่ได้เห็นโซลูชันที่ผู้คนคิดขึ้นมา แต่ฉันคิดว่านี่เป็นข้อบกพร่องในการออกแบบในตัวเลือกที่มี
andreee

คำตอบ:


149

ในการรับแท็ก git ด้วยแฮช SHA1 ของวัตถุแท็กคุณสามารถเรียกใช้:

git show-ref --tags

ผลลัพธ์จะมีลักษณะดังนี้:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

แต่ละบรรทัดเป็นกัญชา SHA1 refs/tags/ของแท็กตามด้วยชื่อแท็กหน้าด้วย

หากคุณต้องการแฮช SHA1 ของคอมมิตแทนที่จะเป็นออบเจ็กต์แท็กคุณสามารถรัน:

git show-ref --tags -d

สิ่งนี้จะให้ผลลัพธ์เช่น:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

บรรทัดที่ลงท้ายด้วย^{}เริ่มต้นด้วยแฮช SHA1 ของคอมมิตจริงที่แท็กชี้ไป


7
หมายเหตุสิ่งนี้จะไม่แยกความแตกต่างระหว่างแท็กที่มีน้ำหนักเบาและมีคำอธิบายประกอบ สำหรับแท็กที่มีน้ำหนักเบาจะแสดงการคอมมิตและสำหรับแท็กที่มีคำอธิบายประกอบจะแสดงแฮชของออบเจ็กต์แท็กเอง
Lily Ballard

20
เพื่อแสดงรายการของแท็กที่มี refs dereferenced (ในกรณีของแท็กข้อเขียน) git show-ref --tags -dการใช้งาน แท็ก Dereferenced จะถูกแก้ไขด้วย a ^{}.
S. Christoffer Eliesen

52

git tagคำสั่งด้อยพัฒนา ต้องการจำนวนมาก แต่ขาดหายไปเช่นรายละเอียดแท็กแบบเต็มและแท็กในลำดับประวัติการกระทำ

ฉันชอบสิ่งนี้แทนซึ่งให้สิ่งที่ฉันต้องการ แต่ไม่สามารถได้รับจากgit tag:

git log --oneline --decorate --tags --no-walk

สิ่งนี้ให้มุมมองที่มีรหัสสีที่ดีมากของแท็กในลำดับเวลาย้อนกลับ (ตามที่ปรากฏในบันทึกทั้งหมด) ด้วยวิธีนี้ไม่เพียง แต่คุณจะเห็นแท็กเท่านั้นคุณยังจะเห็นแฮชแบบย่อและข้อความคอมมิตของแท็กอีกด้วย


ฉันใช้นามแฝงเป็นgit tและgit tagsดังนี้:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

หมายเหตุ:ฉันต้องใช้การเปลี่ยนเส้นทาง bash git tเนื่องจาก Git ไม่รองรับการเรียกนามแฝงจากนามแฝงอื่น (ซึ่งเป็นคนเกียจคร้าน)


หากคุณต้องการดูวันที่และเวลาของการคอมมิตให้ลอง:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

คุณสามารถใช้รูปแบบวันที่อื่นใน--dateตัวเลือกและควบคุมผลลัพธ์ให้ตรงกับรสนิยมที่เป็นเอกลักษณ์ของคุณได้ใน--prettyตัวเลือก ตัวเลือกทั้งสองเป็นอย่างดีการบันทึกไว้ในเอกสารเข้าสู่ระบบคอมไพล์


2
แม้ว่าจะไม่ใช่สิ่งที่ OP ถาม (แสดงคอมมิตsha1 แฮช ) แต่ก็มีประโยชน์มากเนื่องจากข้อความคอมมิตอาจมีประโยชน์เช่นกัน +1 จากฉัน
Stelios Adamantidis

2
@nealmcb git logทรงพลัง! คุณสามารถทำให้มันแสดงให้เห็นว่าสิ่งที่คุณต้องการ ลองgit log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. รูปแบบวันที่อื่น ๆ ได้เช่นกัน เพียงแค่ค้นหา--dateในหน้าความช่วยเหลือ ฉันได้อัปเดตคำตอบเพื่อรวมตัวเลือกนี้
ADTC

1
@SteliosAdamantidis จริงคำตอบของฉันให้ย่อ hashes SHA1 (7 ตัวอักษรแรก) และถ้าคุณต้องการ hashes ยาวเต็มรูปแบบคุณก็สามารถแก้ไขได้ด้วยและ--pretty %Hขอบคุณสำหรับ +1 :)
ADTC

15

แท็กที่มีคำอธิบายประกอบมี SHA − 1 เป็นของตัวเองดังนั้นเราจึงจำเป็นต้องยกเลิกการอ้างอิง อย่างไรก็ตามแท็กที่มีน้ำหนักเบาไม่สามารถอ้างอิงได้เนื่องจากแท็กเหล่านี้ชี้ไปที่การคอมมิตแล้ว ในการแก้ปัญหาเราต้องแสดงรายการทั้งสองและกรองวัตถุกระทำ:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

ผลลัพธ์ด้วยแท็กน้ำหนักเบา:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

ผลลัพธ์พร้อมแท็กที่มีคำอธิบายประกอบ:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

การใช้git log --tags --oneline --no-walkยังจะเลื่อนแท็กที่มีหมายเหตุประกอบโดยอัตโนมัติ :)
ADTC

11

ในการรับ SHA1 ที่อ้างถึงโดยการอ้างอิงประเภทใด ๆ (branch, tag ... ) ให้ใช้git rev-parse:

git rev-parse tag1^0 tag2^0

มันจะพิมพ์เฉพาะ SHA1 แบบเต็มโดยแยกบรรทัด ^0ต่อท้ายเป็นไวยากรณ์พิเศษเพื่อให้แน่ใจว่านี้จะพิมพ์ SHA1 ของกระทำชี้ไปตามแท็กที่ไม่ว่าจะเป็นข้อเขียนหรือไม่ (แท็กคำอธิบายประกอบเป็นวัตถุที่อยู่ทางขวาของมันเองซึ่งมีตัวชี้ไปที่การคอมมิตพร้อมกับข้อมูลเมตาหากคุณรู้ว่าแท็กมีคำอธิบายประกอบและต้องการให้ SHA1 ของแท็กเพียงแค่ปล่อย^0 )

แน่นอนว่าคุณไม่จำเป็นต้องทำสิ่งนี้บ่อยๆเนื่องจากคำสั่ง Git ใด ๆ ที่ยอมรับ SHA1 ก็ควรยอมรับแท็กด้วย!


คำตอบที่ดีที่สุดที่นี่ขอบคุณ @Jefromi โปรดทราบว่าใน Windows cmd เชลล์คำสั่ง git ใด ๆ ที่ใช้ ^ จะต้องถูกยกมาเช่น git rev-parse "tag1 ^ 0" "tag2 ^ 0"
โยโย่

8

ฉันมีคำถามที่คล้ายกัน แต่ต้องการแฮชแท็กเฉพาะ (หลายแท็ก) ฉันพบว่า "show-ref" จะใช้รายการแท็กดังนั้นจึงได้ผล:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

อย่างไรก็ตามการทดลองกับ "git show" ทำให้เกิดคำสั่งนี้:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

เนื่องจากฉันคุ้นเคยกับการใช้ "show" มากกว่า "show-ref" ฉันจึงพบว่าข้อหลังนี้จำง่ายกว่าและมีประโยชน์มากกว่าด้วย

ดูบทสรุปที่ดีในวิธีการบอกว่าแท็กใดชี้ไปที่ Git? .


3

แท็กต้องได้รับการลงนามและ / หรือข้อความ แท็กน้ำหนักเบาไม่มีวัตถุ SHA1 และเป็นเพียงการอ้างอิง git showมิฉะนั้นลอง


3
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

สิ่งนี้ให้รายการการกระทำทั้งหมดสำหรับแท็ก แท็กที่มีคำอธิบายประกอบถูกยกเลิกการอ้างอิง ส่งขอบคุณที่นี่


ทางออกที่ดี หากคุณต้องการมีเฉพาะ tagenames แทนที่จะเป็นชื่ออ้างอิงแบบเต็มคุณสามารถเปลี่ยน use %(refname:short)แทน%(refname).
Radon8472

2

ฉันรับคำสั่งจากanatoly techtonik postเพิ่มข้อความพาดหัวของแท็ก / คอมมิตและจัดรูปแบบเป็น cols ที่ดี

ผลลัพธ์คือเอาต์พุตที่เหมือนกันgit tag -nแต่มีคอมมิตแฮชเป็นคำนำหน้า

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

หากคุณต้องการที่จะมียาวกัญชาแทนสั้น Yust แทนที่โดยobjectname:shortobjectname

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.