จะหา hash of branch ใน Git ได้อย่างไร?


91

เมื่อระบุชื่อสาขาในพื้นที่ / ระยะไกลฉันจะรับแฮชของคอมมิตที่สาขานี้ชี้ไปได้อย่างไร

คำตอบ:


148

คำสั่งgit rev-parseคือเพื่อนของคุณเช่น:

$ git rev-parse development
17f2303133734f4b9a9aacfe52209e04ec11aff4

... หรือสำหรับสาขาการติดตามระยะไกล:

$ git rev-parse origin/master
da1ec1472c108f52d4256049fe1f674af69e785d

โดยทั่วไปคำสั่งนี้มีประโยชน์มากเนื่องจากสามารถแยกวิเคราะห์วิธีการระบุชื่อสาขาgitได้เช่น:

git rev-parse master~3
git rev-parse HEAD@{2.days.ago}

... ฯลฯ


จะดูคอมมิตแฮชทั้งหมดของสาขาในพื้นที่ได้อย่างไร
Mahdi

1
@ Kenji: คุณน่าจะตั้งคำถามใหม่สำหรับสิ่งนั้น แต่ถ้าคุณต้องการเพียงแค่แฮชของแต่ละข้อผูกพันในสาขาfooคุณสามารถทำได้:git log --pretty=format:'%H'
Mark Longair

เมื่อฉันวิ่งบรรทัดถัดไปใน JenkinsFile: def BranchHash = sh "git rev-parse ${BRANCH-NAME}ฉันได้รับ: fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.. เกิดอะไรขึ้น?
arielma


2

อย่าลืมว่าตั้งแต่ Git 2.19 (Q2 2018) Git เตรียมการเปลี่ยนจากแฮช SHA1 เป็น SHA2: ดู " ทำไม Git จึงไม่ใช้ SHA ที่ทันสมัยกว่านี้ "

ด้วย Git 2.25 (ไตรมาสที่ 1 ปี 2020) git rev-parseจะพัฒนาและสะท้อนให้เห็นถึงแฮชใหม่ที่เป็นไปได้

ดูกระทำ fa26d5e , กระทำ cf02be8 , กระทำ 38ee26b , กระทำ 37ab8eb , กระทำ 0370b35 , กระทำ 0253e12 , กระทำ 45e2ef2 , กระทำ 79b0edc , กระทำ 840624f , กระทำ 32a6707 , กระทำ 440bf91 , กระทำ 0b408ca , กระทำ 2eabd38 (28 ตุลาคม 2019) และกระทำ 1bcef51 , กระทำ ecde49b (05 ต.ค. 2019) โดยbrian m. คาร์ลสัน ( bk2204) .
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 28014c1, 10 พ.ย. 2019)

rev-parse: เพิ่ม--show-object-formatตัวเลือก

ลงนามโดย: brian m. คาร์ลสัน

เพิ่มตัวเลือกในการพิมพ์รูปแบบวัตถุที่ใช้สำหรับอินพุตเอาต์พุตหรือที่เก็บข้อมูล
สิ่งนี้ช่วยให้เชลล์สคริปต์ค้นพบอัลกอริทึมแฮชที่ใช้อยู่

เนื่องจากแผนการเปลี่ยนแปลงอนุญาตให้มีอัลกอริทึมการป้อนข้อมูลหลายรายการเอกสารที่เราอาจให้ผลลัพธ์หลายรายการสำหรับการป้อนข้อมูลและรูปแบบที่ผลลัพธ์อาจใช้
แม้ว่าเราจะไม่สนับสนุนสิ่งนี้ในตอนนี้ แต่การจัดทำเอกสารไว้ แต่เนิ่นๆหมายความว่าผู้เขียนสคริปต์สามารถพิสูจน์สคริปต์ของตนได้ในอนาคตเมื่อเราทำ

git rev-parseเอกสารในขณะนี้รวมถึง:

--show-object-format[=(storage|input|output)]:

แสดงรูปแบบอ็อบเจ็กต์ (อัลกอริทึมแฮช) ที่ใช้สำหรับที่เก็บสำหรับการจัดเก็บภายใน.gitไดเร็กทอรีอินพุตหรือเอาต์พุต สำหรับการป้อนข้อมูลอาจมีการพิมพ์อัลกอริทึมหลายรายการโดยแยกช่องว่าง หากไม่ได้ระบุไว้ค่าเริ่มต้นคือ "ที่เก็บข้อมูล"


ด้วย Git 2.29 (ไตรมาสที่ 4 ปี 2020) คุณสามารถตรวจสอบได้ว่าคุณต้องใช้รูปแบบใดในการอ่านค่าคอมมิตแฮชของสาขา (หรือวัตถุอื่น ๆ )

ดูกระทำ e023ff0 , กระทำ 4feb562 , กระทำ 8a06d56 , กระทำ c49fe07 , กระทำ 02a32db , กระทำ ceaa4b3 , กระทำ eff45da , กระทำ b5b46d7 , กระทำ c5aecfc , กระทำ e74b606 , กระทำ 439d3a1 , กระทำ 6c2adf8 , กระทำ de5737c , กระทำ e0a646e , กระทำ 6ff6a67 , กระทำ 831279d , กระทำ b6e5005 , กระทำ 287bb3a , กระทำ 22f1824 , กระทำ db00af9 ,คอมมิต 7187eb1 , คอมมิต 98de0b2 , คอมมิต a5587b8 , คอมมิต 66b6d43 , คอมมิต 2197f87 , คอมมิต c0b65ea , คอมมิต d62607d , คอมมิต d482c23 , คอมมิต 866be6e , คอมมิต 4bacb6d , คอมมิต 252a4ee , คอมมิต 368f3cb , คอมมิต c0b65ea , คอมมิต d62607d , คอมมิต d482c23 , คอมมิต 866be6e , คอมมิต 4bacb6d , คอมมิท 252a4ee , คอมมิต 368f3cb , คอมมิต c0b65ea , คอมมิต d62607d , คอมมิต d482c23 , คอมมิต 866be6e , คอมมิต 4bacb6d , คอมมิต 252a4ee , คอมมิต 368f3cb , คอมมิต abe3dbc3 , คอมมิต , กระทำ 094a685 (29 ก.ค. 2563) โดยbrian m. คาร์ลสัน ( bk2204) .
ดูกระทำ 800e6a7 (29 กรกฎาคม 2020) โดยโยฮันเน Schindelin (dscho )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ e0ad957 , 11 ส.ค. 2020)

docs: เพิ่มเอกสารสำหรับ extensions.objectFormat

ลงนามโดย: brian m. คาร์ลสัน
บทวิจารณ์โดย: Eric Sunshine

บันทึกการextensions.objectFormatตั้งค่าการกำหนดค่า
เตือนผู้ใช้อย่าแก้ไขเอง

git configตอนนี้รวมอยู่ในหน้าคน :

extensions.objectFormat

ระบุอัลกอริทึมแฮชที่จะใช้

ค่าที่ยอมรับได้และ>sha1 หากไม่ระบุจะถือว่า เป็นข้อผิดพลาดในการระบุคีย์นี้เว้นแต่จะเป็น 1sha256
sha1
core.repositoryFormatVersion

โปรดทราบว่าการตั้งค่านี้ควรจะกำหนดโดยหรือgit init การพยายามเปลี่ยนหลังจากเริ่มต้นใช้งานไม่ได้และจะทำให้เกิดปัญหาที่ยากต่อการวินิจฉัยgit clone


เพื่อความชัดเจนด้วย Git 2.29 (ไตรมาสที่ 4 ปี 2020) การสนับสนุน SHA-256 ล่าสุดถูกทำเครื่องหมายว่าเป็นการทดลองในเอกสาร

ดูกระทำ ff233d8 (16 สิงหาคม 2020) โดยมาร์ติน Agren (none )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ d1ff741 , 24 ส.ค. 2020)

Documentation: ทำเครื่องหมาย--object-format=sha256ว่าเป็นการทดลอง

ลงนามโดย: Martin Ågren

หลังจากeff45daab8 (" repository: เปิดใช้งานการสนับสนุน SHA-256 โดยค่าเริ่มต้น", 2020-07-29, Git v2.29.0 - รวมอยู่ในชุดที่ 6 ) การสร้างวานิลลาของ Git ทำให้ผู้ใช้สามารถเรียกใช้เช่น

git init --object-format=sha256  

และแฮ็กไป
นี่อาจเป็นวิธีที่ดีในการได้รับประสบการณ์กับโลก SHA-256 เช่นค้นหาจุดบกพร่อง

GIT_TEST_DEFAULT_HASH=sha256 make test  

ไม่เห็น

แต่มันเป็นโลกที่แยกจากกันจริงๆrepos SHA-256 ดังกล่าวจะอยู่แยกจากชุด repos SHA-1 (ตอนนี้ค่อนข้างใหญ่มาก)
โดยหลักการแล้วการโต้ตอบข้ามพรมแดนเป็นไปได้เช่นผ่าน " diff+ apply" (หรือ " format-patch+ am") แต่ถึงแม้จะมีข้อ จำกัด : การใช้ SHA-256 จะแตกต่างกันในการ repo SHA-1 ในกรณีง่ายๆ แต่ถ้าคุณ ต้องหันไป-3คุณโชคไม่ดี

ในทำนองเดียวกัน " push+ pull" ควรใช้งานได้ แต่จริงๆแล้วคุณจะได้รับการชดเชยจากส่วนที่เหลือของโลกเป็นส่วนใหญ่ นั่นอาจจะเป็นไปได้เมื่อคุณเริ่มต้นที่เก็บข้อมูลของคุณและอาจใช้เวลาหลายเดือนหลังจากนั้น แต่อาจมีสักวันที่คุณเริ่มรู้สึกเสียใจกับการใช้[git init --object-format = sha256 ](https://github.com/git/git/blob/ff233d8dda12657a90d378f2b403bc6c85838c59/Documentation/git-init.txt#L52)<sup>([man](https://git-scm.com/docs/git-init#Documentation/git-init.txt---object-formatltformatgt))</sup>และมี ขุดตัวเองลงไปในหลุมที่ค่อนข้างลึก

ขณะนี้มีหัวข้อต่างๆในการจัดทำเอกสารรูปแบบข้อมูลและโปรโตคอลของเราเกี่ยวกับ SHA-256 และในบางกรณี (กลางและกราฟคอมมิต) เรากำลังพิจารณาปรับวิธีการจัดรูปแบบไฟล์เพื่อระบุรูปแบบวัตถุที่จะใช้

ไม่ว่า--object-formatจะอยู่ที่ใดในเอกสารของเราขอให้ชัดเจนว่าการใช้กับ "sha256" เป็นการทดลอง
หากเราต้องการอธิบายในภายหลังว่าเหตุใดเราจึงไม่สามารถจัดการกับข้อมูลที่เราสร้างขึ้นในปี 2020 ได้เราสามารถชี้ไปที่ย่อหน้านี้ที่เราเพิ่มไว้ที่นี่ได้เสมอ

โดย "รวม ::" - ในการแจ้งเตือนเล็กน้อยเราควรจะสามารถทำให้สอดคล้องกันตลอดทั้งเอกสารและในที่สุดก็ค่อยๆลดความรุนแรงของข้อความนี้ลงได้
วันหนึ่งเราอาจใช้มันเพื่อเริ่มการยุติ--object-format=sha1แต่อย่าล้ำหน้าตัวเอง ...

นอกจากนี้ยังextensions.objectFormatมีการพูดถึงสามครั้งเท่านั้น สองครั้งที่เราเพิ่มข้อจำกัดความรับผิดชอบใหม่นี้และในจุดที่สามเรามีคำเตือน "ห้ามแก้ไข" อยู่แล้ว จากนั้นผู้อ่านที่สนใจควรจะพบสิ่งใหม่ที่เรากำลังเพิ่มเข้ามาในที่สุด

เนื่องจากGIT_DEFAULT_HASHเป็นจุดเริ่มต้นอื่นของฟังก์ชันนี้ให้บันทึกลักษณะการทดลองของฟังก์ชันนี้ด้วย

gitตอนนี้รวมอยู่ในหน้าคน :

ถูกใช้แทน ค่าเริ่มต้นคือ "sha1" ตัวแปรนี้เป็นแบบทดลอง! ดู--object-formatในgit init.

object-format-disclaimerตอนนี้รวมอยู่ในหน้าคน :

ตัวเลือกนี้เป็นแบบทดลอง!
การสนับสนุน SHA-256 อยู่ในช่วงทดลองและยังอยู่ในขั้นเริ่มต้น

โดยทั่วไปที่เก็บ SHA-256 จะไม่สามารถ> แชร์งานกับที่เก็บ SHA-1 "ปกติ" ได้
ควรสันนิษฐานว่าเช่นรูปแบบไฟล์ภายใน Git ที่สัมพันธ์กับที่เก็บ SHA-256 อาจเปลี่ยนไปในรูปแบบที่เข้ากันไม่ได้
ใช้--object-format=sha256เพื่อการทดสอบเท่านั้น


Git 2.29 (Q4 2020) เดียวกันตรวจสอบให้แน่ใจว่า " git clone" ( man )จะทำงานเมื่อหนึ่งโคลนจากที่เก็บ SHA-1 ในขณะที่GIT_DEFAULT_HASHตั้งค่าให้ใช้ SHA-256 แล้ว
ก่อน 2.29 ส่งผลให้มีที่เก็บที่ใช้ไม่ได้ซึ่งครึ่งหนึ่งอ้างว่าเป็นที่เก็บ SHA-256 ที่มีอ็อบเจ็กต์ SHA-1 และการอ้างอิง
สิ่งนี้ได้รับการแก้ไขแล้ว

ดูการกระทำ 47ac970 (20 ก.ย. 2020) โดยbrian m. คาร์ลสัน ( bk2204) .
(รวมโดยJunio C Hamano - gitster-ในการกระทำ b28919c , 29 กันยายน 2020)

builtin/clone: หลีกเลี่ยงความล้มเหลวด้วย GIT_DEFAULT_HASH

รายงานโดย: Matheus Tavares
Signed-off-by: brian m. คาร์ลสัน

หากผู้ใช้กำลังโคลนที่เก็บ SHA-1 โดยGIT_DEFAULT_HASHตั้งค่าเป็น " sha256" เราสามารถลงเอยด้วยที่เก็บที่เวอร์ชันรูปแบบที่เก็บเป็น 0 แต่extensions.objectformatคีย์ถูกตั้งค่าเป็น " sha256"
สิ่งนี้ผิด (ผู้ใช้มีที่เก็บ SHA-1) และไม่ทำงาน (เนื่องจากไม่สามารถใช้ส่วนขยายในที่เก็บ v0 ได้)

สิ่งนี้เกิดขึ้นเนื่องจากในโคลนเราตั้งค่าที่เก็บไว้ในตอนแรกจากนั้นเปลี่ยนอัลกอริทึมตามสิ่งที่ด้านระยะไกลบอกเราว่ากำลังใช้
ในตอนแรกเราได้ตั้งค่าที่เก็บเป็น SHA-256 ในกรณีนี้จากนั้นให้รีเซ็ตเวอร์ชันที่เก็บในภายหลังโดยไม่ต้องล้างส่วนขยาย

เราสามารถตั้งค่าส่วนขยายได้เสมอในกรณีนี้ แต่นั่นหมายความว่าที่เก็บ SHA-1 ของเราไม่สามารถใช้งานร่วมกับ Git เวอร์ชันเก่าได้แม้ว่าจะไม่มีเหตุผลว่าทำไมจึงไม่ควรเป็น
และเราไม่ต้องการเริ่มต้นที่เก็บเป็น SHA-1 ในตอนแรกเนื่องจากนั่นหมายความว่าหากเรากำลังโคลนที่เก็บว่างเราจะล้มเหลวในการให้เกียรติGIT_DEFAULT_HASHตัวแปรและจะจบลงด้วยที่เก็บ SHA-1 ไม่ใช่ ที่เก็บ SHA-256

สิ่งเหล่านี้ไม่น่าสนใจดังนั้นลองบอกรหัสการเริ่มต้นที่เก็บหากเรากำลังสร้างใหม่เช่นนี้และถ้าเป็นเช่นนั้นเพื่อล้างส่วนขยายหากเราใช้ SHA-1
สิ่งนี้ทำให้แน่ใจว่าเราสร้างที่เก็บที่ถูกต้องและใช้งานได้และไม่ทำลายกรณีการใช้งานอื่น ๆ ของเรา

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