จะอ้างอิงการกระทำเริ่มต้นได้อย่างไร?


131

ฉันมีสคริปต์ที่ต้องอ้างอิงการกระทำเริ่มต้นในที่เก็บ คอมไพล์ที่มีการอ้างอิงพิเศษแต่ไม่ได้มีความสอดคล้องกันHEAD TAILฉันไม่พบสิ่งใดgit help rev-parseที่ดูเหมือนจะช่วยฉันได้

นี่คือสิ่งที่ฉันต้องการทำ:

git show TAIL

นี่คือทางเลือกหนึ่งที่ฉันมี:

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

มันค่อนข้างแฮ็คและขึ้นอยู่กับผลลัพธ์ของบันทึก git ที่ไม่เปลี่ยนแปลง

ตอนนี้ฉันแค่แท็กคอมมิตเริ่มต้นและใช้มันเป็น refspec ของฉัน อย่างไรก็ตามฉันต้องการเปิดตัวเครื่องมือทั่วไปดังนั้นจึงไม่ใช่ตัวเลือกที่ดี

คำตอบ:


151

อย่าใช้ git-log สำหรับการเขียนสคริปต์: ใช้อย่างใดอย่างหนึ่งgit-rev-listหรือgit-logด้วยรูปแบบที่กำหนดเองที่ระบุ ( --format=*<sth>*ตัวเลือก)

มีปัญหาเพิ่มเติมกับคำถามของคุณ: อาจมีTAIL root comm (การกระทำโดยไม่มีผู้ปกครอง) มากกว่าหนึ่งรายการในที่เก็บ (แม้ว่าเราจะลดราคาสาขาที่ไม่ได้เชื่อมต่อเช่น 'html', 'man' และ 'todo' ใน git.git พื้นที่เก็บข้อมูล) โดยปกติจะเป็นผลมาจากการเข้าร่วมโครงการแยกกันในโครงการเดียวหรือใช้การรวมแผนผังย่อยของโครงการย่อยที่พัฒนาแยกกัน

ตัวอย่างเช่น git repository มี 6 root commits: git-gui, gitk (subtree-merged), gitweb (รวมเข้าแล้วไม่ได้รับการพัฒนาแยกต่างหากอีกต่อไป), git mail tools (ผสานในช่วงต้นของประวัติโครงการ) และ p4-fast-export ( อาจจะบังเอิญ) นั่นยังไม่นับรากของกิ่ง "html และ" คน "สาขา" สะดวก "ซึ่งมีเอกสารประกอบที่สร้างไว้ล่วงหน้าและสาขา" สิ่งที่ต้องทำ "พร้อมรายการสิ่งที่ต้องทำและสคริปต์


หากคุณมีคอมไพล์ 1.7.4.2 หรือใหม่กว่าคุณสามารถใช้--max-parentsตัวเลือก:

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

มิฉะนั้นคุณสามารถรับรายการคอมมิตที่ไม่มีผู้ปกครอง (root) ทั้งหมดที่เข้าถึงได้จากสาขาปัจจุบันโดยใช้:

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

สำหรับฉันแล้วgit rev-list HEAD | tail -n 1และgit rev-list --max-parents=0 HEADจะไม่ส่งคืนค่าแฮชเดียวกันให้ฉัน สิ่งที่ใช้--max-parents=0คือในความเป็นจริงได้รับการกระทำเริ่มต้นแม้ว่า แค่คิดว่าฉันจะชี้ให้เห็นว่าอย่างหลังดูน่าเชื่อถือมากขึ้น
jbranchaud

1
@Treebranch สิ่งนี้อาจเกิดขึ้นได้หากคุณมีการประทับเวลาแปลก ๆ เพิ่ม--topo-orderในrev-listควรแก้ไขแม้ว่าฉันคิดว่า--max=parents=0คำตอบนั้นดีที่สุด
jthill

35

git rev-list HEAD | tail -n 1 เป็นตัวเลือกที่เสถียรกว่า


14
สิ่งนี้จะส่งกลับหนึ่งในการกระทำหาง; สามารถมีการกระทำมากกว่าหนึ่งรูท (ไม่มีผู้ปกครอง)
Jakub Narębski

คำตอบนี้ทำงานได้อย่างสมบูรณ์และส่งคืนค่าคอมมิชชันเพียงรายการเดียวในขณะที่git rev-list --max-parents=0 HEADส่งกลับ 3 คอมมิต
protoEvangelion

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