นับจำนวนบรรทัดในที่เก็บ git


766

ฉันจะนับจำนวนบรรทัดทั้งหมดที่มีอยู่ในไฟล์ทั้งหมดในที่เก็บ git ได้อย่างไร

git ls-files ให้รายการไฟล์ที่ติดตามโดย git

ฉันกำลังมองหาคำสั่งcatไฟล์ทั้งหมดเหล่านั้น สิ่งที่ต้องการ

git ls-files | [cat all these files] | wc -l

คำตอบ:


1139

xargs จะทำสิ่งที่คุณต้องการ:

git ls-files | xargs cat | wc -l

แต่ด้วยข้อมูลเพิ่มเติมและน่าจะดีกว่าคุณสามารถ:

git ls-files | xargs wc -l

11
ฉันเดาเรื่องไร้สาระ วิธีการรวมเฉพาะไฟล์รหัสต้นฉบับ (เช่น * .cpp) เราได้บางไฟล์ bin มุ่งมั่น :)
แดเนียล

39
ติดgrep cpp |อยู่ที่นั่นก่อนxargsแล้ว
Carl Norum

35
ใช้git ls-files -z | xargs -0 wc -lหากคุณมีไฟล์ที่มีช่องว่างในชื่อ
mpontillo

34
สำหรับการรวม / ไม่รวมไฟล์บางไฟล์ให้ใช้: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lโดยที่ grep part คือ perl regex ใด ๆ ที่คุณต้องการ!
Gabriel

29
หากคุณสนใจไฟล์. java เพียงอย่างเดียวคุณสามารถใช้git ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

สิ่งนี้แสดงความแตกต่างจากทรีว่างเปล่าไปยังทรีทำงานปัจจุบันของคุณ ซึ่งเกิดขึ้นเพื่อนับบรรทัดทั้งหมดในแผนผังการทำงานปัจจุบันของคุณ

ในการรับตัวเลขในแผนผังการทำงานปัจจุบันของคุณให้ทำดังนี้

git diff --shortstat `git hash-object -t tree /dev/null`

1770 files changed, 166776 insertions(+)มันจะทำให้คุณเหมือนสตริง


45
BTW git hash-object -t tree /dev/nullคุณจะได้รับกัญชาว่าด้วยการวิ่ง
ephemient

84
และรวบรัดมากขึ้น:git diff --stat `git hash-object -t tree /dev/null`
ลองอีกครั้ง

10
นี่เป็นวิธีแก้ปัญหาที่ดีกว่าเนื่องจากไม่นับไฟล์ไบนารีเช่นไฟล์เก็บถาวรหรือรูปภาพที่นับในรุ่นด้านบน!
BrainStone

31
+1 ฉันชอบวิธีนี้ดีกว่าเพราะไบนารีไม่ได้นับ นอกจากนี้เรามีความสนใจจริงๆในบรรทัดสุดท้ายของการส่งออก diff git:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella

31
ใช้แทนgit diff --shortstat `git hash-object -t tree /dev/null` เพื่อรับบรรทัดสุดท้ายแทนไม่จำเป็นต้องใช้หาง
Jim Wolff

316

หากคุณต้องการการนับนี้เนื่องจากคุณต้องการทราบแนวคิดของขอบเขตโครงการคุณอาจต้องการผลลัพธ์ของCLOC (“ Count Lines of Code”) ซึ่งจะให้รายละเอียดของรหัสบรรทัดที่มีนัยสำคัญและไม่สำคัญตามภาษา

cloc $(git ls-files)

(สายนี้จะเทียบเท่ากับgit ls-files | xargs cloc. จะใช้sh's $()แทนคำสั่งคุณลักษณะ.)

ตัวอย่างผลลัพธ์:

      20 text files.
      20 unique files.                              
       6 files ignored.

http://cloc.sourceforge.net v 1.62  T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                       2             13            111            309
JSON                             3              0              0             58
HTML                             2              7             12             50
Handlebars                       2              0              0             37
CoffeeScript                     4              1              4             12
SASS                             1              1              1              5
-------------------------------------------------------------------------------
SUM:                            14             22            128            471
-------------------------------------------------------------------------------

คุณจะต้องติดตั้ง CLOC ก่อน คุณอาจจะสามารถติดตั้งclocกับผู้จัดการแพคเกจของคุณ - ตัวอย่างเช่นbrew install clocกับHomebrew

cloc $(git ls-files)cloc .มักจะเป็นในช่วงปรับปรุง ตัวอย่างเช่นผลลัพธ์ตัวอย่างข้างต้นที่มีgit ls-filesรายงานรหัส 471 บรรทัด สำหรับโครงการเดียวกันcloc .รายงาน 456,279 บรรทัดมหันต์ (และใช้เวลาหกนาทีในการทำงาน) เพราะค้นหาการอ้างอิงในnode_modulesโฟลเดอร์Git-ละเว้น


4
CLOC ไม่สนใจบางภาษาเช่น TypeScript
Marcelo Camargo

6
@MarceloCamargo ในขณะนี้รองรับ TypeScript
Alexander

1
สำหรับผู้เริ่มต้นควรรัน "cloc DIRECTORY_WHERE_YOUR_GIT_IN" เพื่อการคำนวณบรรทัด
Shi

คำอธิบายแบบเต็มอยู่ที่นี่: github.com/AlDanial/clocและไบนารีอยู่ที่นี่: github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto

15
คุณสามารถใช้cloc --vcs gitวันนี้เพื่อหลีกเลี่ยงกรณีขอบบางไฟล์ที่มีชื่อไม่ดี (หรือมากเกินไป)
seanf

56

ฉันพบปัญหาการแบตช์git ls-files | xargs wc -lเมื่อจัดการกับไฟล์จำนวนมากที่จำนวนบรรทัดจะถูกดึงออกเป็นหลายtotalบรรทัด

เคล็ดลับจากคำถามทำไมยูทิลิตี wc สร้างหลายบรรทัดด้วย "ผลรวม"? ฉันได้พบคำสั่งต่อไปนี้เพื่อหลีกเลี่ยงปัญหา:

wc -l $(git ls-files)

หรือถ้าคุณต้องการตรวจสอบไฟล์บางไฟล์เท่านั้นเช่นรหัส:

wc -l $(git ls-files | grep '.*\.cs')


นี่ยอดเยี่ยม แต่ดูเหมือนว่าจะล้มเหลวสำหรับเส้นทางที่มีช่องว่างสีขาว มีวิธีแก้ไขไหม
Lea Hayes

1
มีปัญหากับ grep '. * \. m' การรับไฟล์ไบนารีเช่น. mp3, .mp4 ประสบความสำเร็จมากขึ้นด้วยการใช้คำสั่ง find เพื่อแสดงรายการไฟล์รหัสwc -l $(git ls-files | find *.m *.h)
Tico Ballagas

3
@LeaHayes wc -l --files0-from=<(git ls-files -z)นี้เป็นวิธีที่หนึ่ง: ไวยากรณ์ส่งกลับชื่อของไฟล์ที่มีเนื้อหาเป็นผลมาจากการ<(COMMAND) COMMAND
เจ้าชู้

@buck ขอบคุณ แต่ฉันได้รับข้อผิดพลาดเมื่อฉันลองใช้คำสั่ง 'ไม่สามารถสร้างไพพ์สำหรับการทดแทนกระบวนการ: ฟังก์ชั่นไม่ได้ใช้งาน wc: ตัวเลือกที่ไม่รู้จัก --files0-from =' ความคิดใด ๆ
Lea Hayes

1
@LeaHayes ฉันมากับสคริปต์นี้ซึ่งฉันคิดว่าจะทำงานให้คุณ: `` `#! / bin / ผลลัพธ์ทุบตี = $ (git ls-files | xargs -d '\ n' wc -l) ให้ grand_total = 0 สำหรับ x ใน $ (echo "$ results" | egrep '[[: หลัก:]] + รวม $'); ทำอย่างไรให้ grand_total + = $ (echo "$ x" | awk '{พิมพ์ $ 1}') ทำ echo "$ {ผลลัพธ์}" echo "ผลรวมทั้งหมด: $ {grand_total}" `` `
buck

45

ทางออกที่ดีที่สุดสำหรับฉันถูกฝังอยู่ในความคิดเห็นของคำตอบของ @ ephemient ฉันแค่ดึงมันขึ้นมาตรงนี้เพื่อไม่ให้ใครสังเกต เครดิตสำหรับสิ่งนี้ควรไปที่ @FRoZeN (และ @ephemient)

git diff --shortstat `git hash-object -t tree /dev/null`

ส่งคืนผลรวมของไฟล์และบรรทัดในไดเรกทอรีการทำงานของ repo โดยไม่มีเสียงรบกวนใด ๆ เพิ่มเติม โบนัสนับเฉพาะซอร์สโค้ดเท่านั้น - ไฟล์ไบนารีถูกแยกออกจากการนับ

คำสั่งดังกล่าวใช้งานได้บน Linux และ OS X รุ่นข้ามแพลตฟอร์มของมันคือ

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

ใช้งานได้บน Windows เช่นกัน

สำหรับบันทึกตัวเลือกสำหรับการยกเว้นบรรทัดว่าง

  • -w/ --ignore-all-space,
  • -b/ --ignore-space-change,
  • --ignore-blank-lines,
  • --ignore-space-at-eol

ไม่ได้มีผลกระทบใด ๆ --shortstatเมื่อใช้กับ เส้นที่ว่างเปล่าจะถูกนับ


1
git mktree </dev/nullหรือtrue|git mktreeหรือgit mktree <&-หรือ :|git mktreeสำหรับการกดแป้น - ตัวนับในหมู่พวกเรา :-) - ต้นไม้ว่างเปล่าที่ลอยอยู่รอบ ๆ repo จะไม่ทำร้ายอะไรเลย
jthill

2
สำหรับคนที่สงสัยว่าแฮชคืออะไรจากสีน้ำเงิน: stackoverflow.com/questions/9765453/ …
Tejas Kale

19

สิ่งนี้ทำงานได้ตั้งแต่cloc 1.68:

cloc --vcs=git


--vcsใช้งานไม่ได้สำหรับฉันบางทีมันอาจถูกลบออก cloc .ในขณะที่ repo คอมไพล์ทำงาน OTOH
acdcjunior

13

ฉันเล่นกับ cmder ( http://gooseberrycreative.com/cmder/ ) และฉันต้องการนับบรรทัดของ html, css, java และ javascript ในขณะที่บางคำตอบข้างต้นทำงานได้orรูปแบบใน grep ไม่พบ - ฉันพบที่นี่ ( /unix/37313/how-do-i-grep-for-multiple-patterns ) ที่ฉันมี เพื่อหนีมัน

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

git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l


2
เรื่องนี้ดูเหมือนจะตอบสนองด้วยชิ้นสำหรับฉัน การใช้ grep ของคุณร่วมกับโซลูชันของ Justin Aquadro นั้นส่งผลดีต่อฉัน wc -l $ (gs ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .shson) $")
Peter Mark

9

ฉันใช้สิ่งต่อไปนี้:

git grep ^ | wc -l

นี้จะค้นหาไฟล์ทั้งหมดที่มีเวอร์ชันโดย git สำหรับ regex ^ซึ่งแสดงถึงจุดเริ่มต้นของบรรทัดดังนั้นคำสั่งนี้จะให้จำนวนบรรทัดทั้งหมด!


3

ฉันทำอย่างนี้:

git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l

สิ่งนี้ใช้งานได้หากคุณนับไฟล์ข้อความทั้งหมดในที่เก็บเป็นไฟล์ที่น่าสนใจ หากมีการพิจารณาเอกสารประกอบ ฯลฯ สามารถเพิ่มตัวกรองการยกเว้นได้


3

เครื่องมือนี้ใน github https://github.com/flosse/slocสามารถให้ผลลัพธ์ในลักษณะที่สื่อความหมายได้มากขึ้น มันจะสร้างสถิติของซอร์สโค้ดของคุณ:

  • เส้นทางกายภาพ
  • บรรทัดของรหัส (แหล่งที่มา)
  • เส้นที่มีความคิดเห็น
  • ความคิดเห็นบรรทัดเดียว
  • เส้นที่มีความคิดเห็นบล็อก
  • บรรทัดผสมกับแหล่งที่มาและความคิดเห็น
  • บรรทัดว่าง

1

ลอง:

find . -type f -name '*.*' -exec wc -l {} + 

ในไดเรกทอรี / ไดเรกทอรีที่มีปัญหา


0
: | git mktree | git diff --shortstat --stdin

หรือ:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin

0

ขึ้นอยู่กับว่าคุณต้องการรวมไฟล์ไบนารีหรือไม่มีสองวิธีแก้ไข

  1. git grep --cached -al '' | xargs -P 4 cat | wc -l
  2. git grep --cached -Il '' | xargs -P 4 cat | wc -l

    "xargs -P 4" หมายความว่าสามารถอ่านไฟล์โดยใช้กระบวนการแบบขนานสี่กระบวนการ สิ่งนี้มีประโยชน์มากหากคุณกำลังสแกนที่เก็บข้อมูลขนาดใหญ่มาก ขึ้นอยู่กับความจุของเครื่องคุณอาจเพิ่มจำนวนกระบวนการ

    -a ประมวลผลไฟล์ไบนารีเป็นข้อความ (รวมไบนารี)
    -l '' แสดงเฉพาะชื่อไฟล์แทนบรรทัดที่ตรงกัน (สแกนเฉพาะไฟล์ที่ไม่ใช่ไฟล์เปล่า)
    - ฉันไม่ตรงกับรูปแบบในไฟล์ไบนารี (ยกเว้นไบนารี)
    --cached, ค้นหาในดัชนีแทนที่จะค้นหาในแผนผังงาน (รวมไฟล์ที่ไม่มีข้อผูกมัด)

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