Git rev-parse ทำหน้าที่อะไร?


282

อะไรgit rev-parseทำอย่างไร

ฉันอ่าน man page แล้ว แต่มันทำให้เกิดคำถามมากกว่าคำตอบ สิ่งที่ชอบ:

เลือกและพารามิเตอร์การนวด

นวด ? นั่นหมายความว่าอย่างไร?

ฉันใช้เป็นเครื่องมือแก้ไข (ถึง SHA1) ของตัวระบุการแก้ไขเช่น

git rev-parse HEAD^

หรือ

git rev-parse origin/master

นี่คือวัตถุประสงค์ของคำสั่งหรือไม่ ถ้าไม่ถูกต้องที่จะใช้เพื่อให้บรรลุนี้


3
เท่าที่ฉันเห็นใน man page มันเป็นยูทิลิตี้ภายในเป็นส่วนใหญ่ในการแยกวิเคราะห์การแก้ไข / ชื่อวัตถุสำหรับคำสั่งอื่น ๆ สิ่งที่คุณทำคือจุดประสงค์ของrev-parseคำสั่ง นอกจากนี้คุณยังสามารถใช้มันเพื่อทำให้บรรทัดคำสั่งเป็นปกติเพื่อให้โปรแกรมจริงไม่จำเป็นต้องเข้าใจไวยากรณ์ชื่อวัตถุที่ซับซ้อนของ Git (คุณจะใช้git rev-parseในการเปลี่ยนแปลงหรือ "นวด" พารามิเตอร์บางอย่างในบรรทัดคำสั่งก่อน โปรแกรมจริงเรียกว่า)

ดูเพิ่มเติมที่github.com/git/git/commit/…
VonC

60
หน้าคู่มือสำหรับgit rev-parseเข้าใจไม่ได้อย่างน่าหัวเราะ ฉันประหลาดใจที่ไม่มีใครใส่ใจที่จะเขียนศัพท์แสงนั้นเป็นสิ่งที่มนุษย์อ่านได้แม้หลังจากผ่านไป 5 ปี
not2qubit

@ not2qubit ฉัน: 'ขอบคุณสำหรับการชี้แจงฉันรู้สึกแย่' Linus Torvalds: 'ฉันอ่านอีกครั้งคุณไม่เข้าใจส่วนใดของส่วนนี้'
Brain2000

คำตอบ:


245

git rev-parseเป็นplumbingคำสั่งเสริมที่ใช้สำหรับการจัดการเป็นหลัก

การใช้งานทั่วไปอย่างหนึ่งของgit rev-parseคือการพิมพ์แฮช SHA1 ตามที่ระบุตัวแก้ไข นอกจากนี้ยังมีตัวเลือกมากมายในการจัดรูปแบบผลลัพธ์เช่น--shortสำหรับการพิมพ์ SHA1 ที่ไม่ซ้ำกัน

มีกรณีการใช้งานอื่น ๆ เช่นกัน (ในสคริปต์และเครื่องมืออื่น ๆ ที่สร้างขึ้นจาก git) ที่ฉันเคยใช้:

  • --verify เพื่อตรวจสอบว่าวัตถุที่ระบุเป็นวัตถุคอมไพล์ที่ถูกต้อง
  • --git-dirสำหรับการแสดงเส้นทาง abs / สัมพัทธ์ของ.gitไดเรกทอรี
  • ตรวจสอบว่าคุณอยู่ในที่เก็บข้อมูลที่ใช้--is-inside-git-dirหรืออยู่ในแผนผังต้นไม้โดยใช้--is-inside-work-tree
  • ตรวจสอบว่า repo ใช้งานไม่ได้หรือไม่ --is-bare-repository
  • การพิมพ์ SHA1 hashes ของ branch ( --branches), tags ( --tags) และ refs ยังสามารถกรองตามระยะไกล (โดยใช้--remote)
  • --parse-optเพื่อทำให้อาร์กิวเมนต์เป็นมาตรฐานในสคริปต์ (ชนิดที่คล้ายกับgetopt) และพิมพ์สตริงเอาต์พุตที่สามารถใช้ได้กับeval

Massageเพียงแสดงว่าเป็นไปได้ที่จะแปลงข้อมูลจากรูปแบบหนึ่งไปเป็นอีกรูปแบบหนึ่งเช่นคำสั่งการแปลงรูป นี่คือตัวอย่างด่วน ๆ ที่ฉันนึกได้:

  • สาขาหรือชื่อแท็กลงใน SHA1 ของคอมมิชชันที่ถูกชี้ไปเพื่อให้สามารถส่งผ่านไปยังคำสั่งการวางท่อซึ่งยอมรับเฉพาะค่า SHA1 สำหรับการคอมมิชชัน
  • ช่วงการแก้ไขA..Bสำหรับgit logหรือgit diffเป็นอาร์กิวเมนต์ที่เทียบเท่าสำหรับคำสั่งการวางระบบท่อB ^A

102

เพียงเพื่ออธิบายรายละเอียดเกี่ยวกับนิรุกติศาสตร์ของชื่อคำสั่งrev-parseGit ใช้คำศัพท์revในคำสั่งการประปาอย่างสม่ำเสมอโดยย่อสำหรับ "การแก้ไข" และโดยทั่วไปหมายถึงแฮช SHA1 แบบ 40 อักขระสำหรับการคอมมิท ตัวอย่างคำสั่งrev-listพิมพ์รายการ 40-char ที่ทำแฮชสำหรับสาขาหรืออะไรก็ตาม

parse-a-commitish-to-a-full-SHA1-hashในกรณีนี้ชื่ออาจจะมีการขยายไปยัง ในขณะที่คำสั่งมีฟังก์ชั่นเสริมหลายอย่างที่กล่าวถึงในคำตอบของ Tuxdude ดูเหมือนจะเป็นกรณีที่ใช้ในการเปลี่ยนการอ้างอิงที่เป็นมิตรกับผู้ใช้เช่นชื่อสาขาหรือแฮชตัวย่อลงในแฮช SHA1 40 ตัวอักษรที่ไม่มีประโยชน์ วัตถุประสงค์

ฉันรู้ว่าฉันคิดว่ามันเป็น "reverse-parse" บางอย่างก่อนที่ฉันจะคิดออกและมีปัญหาแบบเดียวกันที่ทำให้รู้สึกถึงคำว่า "massaging" และ "manipulation" :)

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


9
ขอบคุณสำหรับคำอธิบายฉันไม่เข้าใจ git-docs หนึ่งบิต: git-scm.com/docs/git-rev-parse
Jacob McKay

คุณสามารถยกตัวอย่างmessagingและmanipulationตามที่คุณพูดถึงมาก่อนหรือไม่
โบเฉิน

5
ในคำอื่น ๆสั้นสำหรับgit rev-parse git revision-parseใช้อินพุตที่กำหนดและส่งคืน ID การแก้ไข 40 อักขระที่สอดคล้องกัน
Jonathan Benn

36

git rev-parseทำงานเพื่อรับชื่อสาขาปัจจุบันโดยใช้แฟล็ก --abbrev-refเช่น:

git rev-parse --abbrev-ref HEAD

เป็นไปได้หรือไม่ที่จะได้รับข้อความยืนยันด้วยวิธีนี้
Leo Droidcoder

2
@LeoDroidcoder ลองgit log --format=%B -n 1 <revision>
hipyhop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.