ฉันจะรับ Git ได้อย่างไร


753

ฉันต้องการรับจำนวนการคอมมิชชันของที่เก็บ Git ของฉันเช่นบิตการแก้ไข SVN

เป้าหมายคือใช้เป็นหมายเลขบิลด์ที่เพิ่มและไม่ซ้ำใคร

ฉันทำอย่างนั้นในปัจจุบันบน Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

แต่ฉันรู้สึกว่ามันเป็นการแฮ็คเล็กน้อย

มีวิธีที่ดีกว่าในการทำเช่นนั้น? มันจะเจ๋งถ้าฉันไม่ต้องการwcหรือแม้แต่ Git จริง ๆ มันสามารถทำงานบน Windows เปล่าได้ เพียงอ่านไฟล์หรือโครงสร้างไดเรกทอรี ...


1
คุณอาจพบคำตอบที่น่าสนใจที่นี่: อะไรคือ git ที่เทียบเท่ากับหมายเลขการแก้ไข?
Sebastien Varrette

190
git rev-list HEAD --count git rev-list
Jake Berger

14
@ jberger: ฉันคิดว่าความคิดเห็นของคุณควรถูกแปลงเป็นคำตอบ
utapyngo

@utapyngo: อีก 13 คำตอบฉันรู้ว่ามันถูกฝังอยู่ ฉันโพสต์ไว้ที่นี่แล้ว
Jake Berger

@ jberger คำตอบนี้ใช้ไม่ได้กับ git1.7.0
Vorac

คำตอบ:


1160

ในการรับค่าคอมมิชชันสำหรับการแก้ไข ( HEAD,, masterแฮชการคอมมิต):

git rev-list --count <revision>

วิธีรับค่าคอมมิชชันในทุกสาขา:

git rev-list --all --count

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


27
git shortlog | grep -E '^[ ]+\w+' | wc -lถ้าคุณต้องการรับจำนวนทั้งหมดและgit shortlog | grep -E '^[^ ]'ต้องการรับจำนวนการกระทำสำหรับผู้มีส่วนร่วมทุกคน
skalee

2
wc -lขอบคุณสำหรับการชี้ให้เห็น Minimalism FTW ฉันรวมมันเป็นคำตอบของฉัน
Benjamin Atkin

17
วิธีนี้เป็นทั้งแฮ็ค (คล้ายกับgit log --pretty=format:'' | wc -lวิธีการที่ให้ไว้ในคำถามเดิม) และไม่ถูกต้อง: คุณสามารถเห็นสิ่งนี้ได้โดยการย้อนกลับการแข่งขัน ( git shortlog | grep -Ev '^[ ]+\w+') และเห็นว่าการกระทำเช่นนั้นไม่มีข้อความ (เช่น "<none>") การใช้git rev-list HEAD --countนั้นกระชับและแม่นยำยิ่งขึ้น
ctrueden

17
@BenAtkin: ฉันขอโทษ; มันไม่ได้เป็นความตั้งใจของฉันที่จะล่วงละเมิดเพียงจริง จุดที่เกี่ยวกับวันที่ของการตอบสนอง ในขณะนั้นโซลูชันของคุณอาจเป็นโซลูชันที่ดีที่สุด แต่ตอนนี้ฉันยืนหยัดด้วยคำพูดที่git rev-list HEAD --countเป็นทางออกที่ดีกว่า
ctrueden

3
เพิ่มคำตอบด้วยและใช้ได้กับเวอร์ชันเก่า:git log --oneline | wc -l
Jimmy Kane

155

git shortlog เป็นวิธีหนึ่ง


5
ไท สิ่งนี้ใช้ได้กับฉันเมื่อนับการกระทำในช่วงหนึ่ง shortit คอมไพล์ sha1..sha2
RJFalconer

1
อ๊ะบรรทัดแรกของ shortlog คอมไพล์มีจำนวนการคอมมิท แก้ไขปัญหา.
Robert Massaioli

5
จำนวนการคอมมิทถูกจัดกลุ่มตามคอมมิทเตอร์ไม่ดีเท่าไหร่ สามารถนับจำนวนบรรทัดใน shortlog คอมไพล์ แต่วิธีนี้ใช้ไม่ได้กับ ssh โดยไม่มีเทอร์มินัลด้วยเหตุผลบางอย่าง (เพจเจอร์?) โซลูชันดั้งเดิมของผู้ถามนั้นดีที่สุด! git log --pretty = format: '' | wc -l
Sam Watkins

4
อย่างไรก็ตามฉันขอแนะนำgit rev-list HEAD --countมากกว่าวิธีการดั้งเดิมที่ให้ไว้ใน OP ในการทดสอบของฉันgit log --pretty=format:'' | wc -lถูกปิดโดยหนึ่ง
ctrueden

3
@ctrueden git log --oneline | wc -lไม่ได้ปิดตัวเอง (OS X 10.8.5)
Andy Stewart

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: รายการคอมมิทที่สามารถเข้าถึงได้โดยทำตามลิงก์พาเรนต์จากการคอมมิทที่กำหนด (ในกรณีนี้คือHEAD )

--count : พิมพ์หมายเลขที่ระบุจำนวนการคอมมิทที่จะแสดงรายการและระงับเอาต์พุตอื่นทั้งหมด


101

คำสั่งนี้ส่งคืนจำนวนการคอมมิตที่จัดกลุ่มโดยผู้มอบหมาย:

git shortlog -s

เอาท์พุท:

14 John lennon
9  Janis Joplin

คุณอาจต้องการที่จะรู้ว่าอาร์กิวเมนต์เป็นรูปแบบการหดตัวของ-s--summary


11
git shortlogโดยตัวเองไม่ได้อยู่ที่คำถามเดิมของทั้งหมดจำนวนกระทำ (ไม่ได้จัดกลุ่มโดยผู้เขียน) ใช้git rev-list HEAD --countแทน
ctrueden

5
! น่ากลัว คุณสามารถจัดเรียงได้| sort -nเช่นกัน
Mohsen

54

หากคุณกำลังมองหาตัวระบุที่ไม่ซ้ำใครและยังสามารถอ่านได้สำหรับคอมมิท git อธิบายอาจเป็นสิ่งที่คุณต้องการ


2
ที่สามารถใช้งานได้และจะใช้งานง่ายกว่า algo แบบกำหนดเอง +1
VonC

2
ฉันไม่ทราบว่าคอมไพล์อธิบาย จำนวนเล็กน้อยระหว่างชื่อแท็กและ sha1 นี้เป็นสิ่งที่ฉันกำลังมองหา ขอบคุณ.
Splo

2
ดูที่สคริปต์ GIT-VERSION-GEN และวิธีใช้ในที่เก็บ git และสคริปต์ที่คล้ายกันในแหล่งเคอร์เนล Linux (และวิธีที่ใช้ใน Makefile)
Jakub Narębski

สิ่งนี้ให้รหัสที่ไม่ซ้ำกัน แต่ไม่ใช่รหัสที่ไม่น่าเชื่อถือ ไม่ได้ผลสำหรับฉัน อย่างไรก็ตามคำตอบของเบ็นแอทคินนั้นให้นับจำนวนซึ่งในทางปฏิบัติควรจะเพิ่มขึ้น คำตอบของ Aaron Digulla นั้นแน่นอนกว่า แต่ก็ต้องการงานมากกว่านี้
JOM

2
ใช่นั่นเป็นเพราะแนวคิดของรหัสส่วนเพิ่มไม่สมเหตุสมผลกับระบบควบคุมเวอร์ชันที่แจกจ่าย
Bombe

34

คุณไม่ใช่คนแรกที่คิดเกี่ยวกับ"หมายเลขการแก้ไข" ใน Gitแต่ ' wc' ค่อนข้างอันตรายเนื่องจากการลบสามารถลบหรือบีบได้และประวัติการเข้าชม

"หมายเลขการแก้ไข" มีความสำคัญอย่างยิ่งสำหรับการโค่นล้มเนื่องจากจำเป็นในกรณีของการรวม (SVN1.5 และ 1.6 ได้รับการปรับปรุงที่ด้านหน้า)

คุณสามารถจบลงด้วย hook pre-commit ซึ่งจะรวมถึงหมายเลขการแก้ไขในความคิดเห็นโดยอัลกอริทึมที่ไม่เกี่ยวข้องกับการค้นหาประวัติทั้งหมดของสาขาเพื่อกำหนดหมายเลขที่ถูกต้อง

ตลาดสดเกิดขึ้นจริงด้วยอัลกอริทึมดังกล่าวและอาจเป็นจุดเริ่มต้นที่ดีสำหรับสิ่งที่คุณต้องการทำ

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


เพื่อแสดงความคิดของ Aaronคุณสามารถผนวก Git คอมมิชชันแฮชลงในไฟล์ "ข้อมูล"ของแอปพลิเคชันที่คุณแจกจ่ายด้วยแอปพลิเคชันของคุณ

ด้วยวิธีนี้กล่องเกี่ยวกับจะมีลักษณะดังนี้:

เกี่ยวกับกล่อง

จำนวน applicative เป็นส่วนหนึ่งของการกระทำ แต่ 'แอพลิเคชันของ 'ข้อมูล' แฟ้ม' ถูกสร้างขึ้นในระหว่างกระบวนการบรรจุภัณฑ์ที่มีประสิทธิภาพการเชื่อมโยงapplicativeหมายเลขการสร้างการแก้ไขทางเทคนิคID


2
ผมได้ปรับปรุงสคริปต์ของฉันที่จะทำงานร่วมกับ Xcode 3. คุณสามารถเลือกได้ถึงวันที่รุ่นจากgist.github.com/208825
Abizern


22

วิธีง่ายๆคือ:

 git log --oneline | wc -l

oneline รับรองว่า


1
'wc' ไม่รู้จักว่าเป็นคำสั่งภายในหรือภายนอก, โปรแกรมที่ทำงานได้หรือไฟล์แบตช์
user815693

คุณใช้ระบบอะไรดี? มันเป็น UNIX ใช่หรือไม่ /
Jimmy Kane

1
ดูเหมือนจะเร็วขึ้นเช่นกันหากคุณมีข้อผูกพันหลายพัน คำสั่งอื่นทั้งหมดใช้เวลามากเกินไป
Danny Coulombe

21

เพื่อให้เป็นตัวแปรวิธีที่ง่ายที่สุดคือ:

export GIT_REV_COUNT=`git rev-list --all --count`

5
แน่นอนว่าgit rev-listเป็นเครื่องมือที่ถูกต้องที่จะใช้ไม่git logเหมือนที่คนอื่นพูด
Nayuki

1
ในการนับจำนวนการคอมมิชชันในสายเลือดเพื่อเข้าถึง HEAD: git rev-list --first-parent | wc -l
200_success

คุณไม่ต้องการwc -lเพียงแค่ใช้--countสวิตช์: git rev-list --all --count.
slm

ขอบคุณ @slm ฉันได้อัปเดตคำตอบแล้ว แม้ว่าฉันสงสัยว่าคำตอบเดิมนั้นเก่ากว่า--countสวิตช์เอง
John Gietzen

@JohnGietzen - ใช่แล้วฉันคิดว่า 8-) เพิ่งจะเพิ่มรายละเอียดนี้เพื่อช่วย
slm

17

shortit Git เป็นวิธีหนึ่งในการรับรายละเอียดการส่งข้อมูล:

git shortlog -s -n

สิ่งนี้จะให้จำนวนการคอมมิตตามด้วยชื่อผู้แต่ง ตัวเลือก -s ลบข้อความกระทำทั้งหมดสำหรับแต่ละกระทำที่ผู้เขียนทำ ลบตัวเลือกเดียวกันหากคุณต้องการดูข้อความยืนยัน อ็อพชัน -n ใช้สำหรับการเรียงลำดับรายการทั้งหมด หวังว่านี่จะช่วยได้


2
git shortlogโดยตัวเองไม่ได้อยู่ที่คำถามเดิมของทั้งหมดจำนวนกระทำ (ไม่ได้จัดกลุ่มโดยผู้เขียน) ใช้git rev-list HEAD --countแทน
ctrueden


7

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


4

หากคุณใช้สาขาเดียวเช่นเจ้านายฉันคิดว่านี่จะใช้งานได้ดี:

git rev-list --full-history --all | wc -l

นี่จะแสดงผลลัพธ์เป็นตัวเลขเท่านั้น คุณสามารถใช้นามแฝงเป็นบางอย่างได้

git revno

เพื่อทำให้สิ่งต่าง ๆ สะดวก หากต้องการทำเช่นนั้นให้แก้ไข.git/configไฟล์ของคุณและเพิ่มใน:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

สิ่งนี้จะไม่ทำงานบน Windows ฉันไม่ทราบว่าเทียบเท่า "wc" สำหรับระบบปฏิบัติการนั้น แต่การเขียนสคริปต์ Python เพื่อทำการนับสำหรับคุณจะเป็นโซลูชันที่มีหลายแพลตฟอร์ม

แก้ไข : รับนับระหว่างสองคอมมิชชัน:


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

git rev-list --count [older-commit]..[newer-commit]

3

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


หากผู้พัฒนาสองรายนี้ไม่ทำเช่นนั้นตัวเลขการสร้างของพวกเขาจะชนกัน / ตัดกันเป็นระยะหรือไม่? จะเกิดอะไรขึ้นถ้าทั้งคู่ทำบิลด์ระหว่าง revs เดียวกันของ repo ที่แชร์กันหรืออาจจะเกิดการชนกันก็ต่อเมื่อมีการเปลี่ยนแปลงที่ไม่ได้ทำไว้กับ repo ที่แชร์กัน ไม่แน่ใจ.
เตาแก๊ส

แน่นอน แต่ข้อขัดแย้งบอกคุณว่าต้องทำอย่างไร: แค่คุยกับคนอื่นหรือใช้หมายเลขที่สูงกว่าเสมอ ข้อควรจำ: ตัวเลขไม่สามารถรักษากระบวนการสร้างที่เสียหายได้อย่างน่าอัศจรรย์ มันเป็นเพียงการเตือนหรือคำใบ้ว่าคุณต้องตรวจสอบบางอย่าง
Aaron Digulla

1
อ๊ะใช่แล้วไฟล์มายากล buildno.txt นั้นถูกสร้างขึ้นพร้อมกับส่วนที่เหลือ วิธีการที่ดีสำหรับทีมขนาดเล็กหรือทีมใหญ่ที่หลีกเลี่ยงการสร้างแบบขนาน ที่เดียวที่ฉันนึกได้ว่ามันอาจไม่ได้ผลเช่นกันสำหรับทีมขนาดใหญ่ที่ใช้ภาษาสคริปต์ (python) ที่ไม่จำเป็นต้องมีกระบวนการสร้าง (เพื่อมอบหมายให้บุคคลเดียวทำการสร้าง)
เตาแก๊ส

3

ใน บริษัท ของเราเราย้ายจาก SVN เป็น Git การขาดตัวเลขการแก้ไขเป็นปัญหาใหญ่!

ทำgit svn cloneแล้วติดแท็ก SVN ล่าสุดที่กระทำโดยหมายเลขการแก้ไข SVN:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

จากนั้นคุณสามารถรับหมายเลขการแก้ไขด้วยความช่วยเหลือของ

git describe --tags --long

คำสั่งนี้ให้บางสิ่งเช่น:

7603-3-g7f4610d

หมายถึง: แท็กสุดท้ายคือ 7603 - เป็นการแก้ไข SVN 3 - นับจากข้อผูกพัน เราจำเป็นต้องเพิ่มพวกเขา

ดังนั้นหมายเลขการแก้ไขสามารถนับได้โดยสคริปต์นี้:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

สิ่งที่ฉันเคยใช้คือ:

git log | grep "^commit" | wc -l

เรียบง่าย แต่ก็ใช้งานได้


4
ใช้เวลาหนึ่งบรรทัดข้อความกระทำเริ่มต้นด้วย "กระทำ" ที่จะทำลายนับ ตัวอย่างเช่น: "แก้ไขข้อผิดพลาดและการทดสอบที่ผิดพลาดซึ่งฉันผลักเข้าไปใน \ ncommit ครั้งล่าสุดโดยไม่ตั้งใจ"
Paweł Polewicz

1

ใช้ไวยากรณ์ Bash

$(git rev-list --count HEAD)

ดูดีสำหรับประวัติเชิงเส้นอย่างหมดจด หากคุณต้องการบางครั้งมี“ ตัวเลข” จากสาขา (อิงตามmaster) ให้พิจารณา:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

เมื่อเรียกใช้จากการชำระเงินmasterคุณจะได้1234.0อย่างง่ายดาย เมื่อเรียกใช้จากการชำระเงินของสาขาคุณจะได้รับสิ่งที่ชอบ1234.13ถ้ามีการกระทำ 13 รายการในสาขานั้น เห็นได้ชัดว่านี่จะเป็นประโยชน์เพียงตราบเท่าที่คุณกำลังพิจารณาที่สาขาหนึ่งมากที่สุดจากการmasterแก้ไขที่กำหนด

--first-parent สามารถเพิ่มลงในหมายเลขไมโครเพื่อระงับการกระทำบางอย่างที่เกิดขึ้นจากการรวมสาขาอื่น ๆ แม้ว่ามันอาจไม่จำเป็น


1

คุณสามารถลอง

git log --oneline | wc -l

หรือเพื่อแสดงรายการการกระทำทั้งหมดที่กระทำโดยบุคคลที่มีส่วนร่วมในที่เก็บ

git shortlog -s


0

ใช้ shortlist คอมไพล์เช่นนี้

git shortlog -sn

หรือสร้างนามแฝง (สำหรับเทอร์มินัล ZSH)

# show contributors by commits alias gcall="git shortlog -sn"


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