ฉันจะนับจำนวนบรรทัดทั้งหมดที่มีอยู่ในไฟล์ทั้งหมดในที่เก็บ git ได้อย่างไร
git ls-files
ให้รายการไฟล์ที่ติดตามโดย git
ฉันกำลังมองหาคำสั่งcat
ไฟล์ทั้งหมดเหล่านั้น สิ่งที่ต้องการ
git ls-files | [cat all these files] | wc -l
ฉันจะนับจำนวนบรรทัดทั้งหมดที่มีอยู่ในไฟล์ทั้งหมดในที่เก็บ git ได้อย่างไร
git ls-files
ให้รายการไฟล์ที่ติดตามโดย git
ฉันกำลังมองหาคำสั่งcat
ไฟล์ทั้งหมดเหล่านั้น สิ่งที่ต้องการ
git ls-files | [cat all these files] | wc -l
คำตอบ:
xargs
จะทำสิ่งที่คุณต้องการ:
git ls-files | xargs cat | wc -l
แต่ด้วยข้อมูลเพิ่มเติมและน่าจะดีกว่าคุณสามารถ:
git ls-files | xargs wc -l
grep cpp |
อยู่ที่นั่นก่อนxargs
แล้ว
git ls-files -z | xargs -0 wc -l
หากคุณมีไฟล์ที่มีช่องว่างในชื่อ
git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -l
โดยที่ grep part คือ perl regex ใด ๆ ที่คุณต้องการ!
git ls-files | grep "\.java$" | xargs wc -l
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904
สิ่งนี้แสดงความแตกต่างจากทรีว่างเปล่าไปยังทรีทำงานปัจจุบันของคุณ ซึ่งเกิดขึ้นเพื่อนับบรรทัดทั้งหมดในแผนผังการทำงานปัจจุบันของคุณ
ในการรับตัวเลขในแผนผังการทำงานปัจจุบันของคุณให้ทำดังนี้
git diff --shortstat `git hash-object -t tree /dev/null`
1770 files changed, 166776 insertions(+)
มันจะทำให้คุณเหมือนสตริง
git hash-object -t tree /dev/null
คุณจะได้รับกัญชาว่าด้วยการวิ่ง
git diff --stat `git hash-object -t tree /dev/null`
git diff --stat `git hash-object -t tree /dev/null` | tail -1
git diff --shortstat `git hash-object -t tree /dev/null`
เพื่อรับบรรทัดสุดท้ายแทนไม่จำเป็นต้องใช้หาง
หากคุณต้องการการนับนี้เนื่องจากคุณต้องการทราบแนวคิดของขอบเขตโครงการคุณอาจต้องการผลลัพธ์ของ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-ละเว้น
cloc --vcs git
วันนี้เพื่อหลีกเลี่ยงกรณีขอบบางไฟล์ที่มีชื่อไม่ดี (หรือมากเกินไป)
ฉันพบปัญหาการแบตช์git ls-files | xargs wc -l
เมื่อจัดการกับไฟล์จำนวนมากที่จำนวนบรรทัดจะถูกดึงออกเป็นหลายtotal
บรรทัด
เคล็ดลับจากคำถามทำไมยูทิลิตี wc สร้างหลายบรรทัดด้วย "ผลรวม"? ฉันได้พบคำสั่งต่อไปนี้เพื่อหลีกเลี่ยงปัญหา:
wc -l $(git ls-files)
หรือถ้าคุณต้องการตรวจสอบไฟล์บางไฟล์เท่านั้นเช่นรหัส:
wc -l $(git ls-files | grep '.*\.cs')
wc -l $(git ls-files | find *.m *.h)
wc -l --files0-from=<(git ls-files -z)
นี้เป็นวิธีที่หนึ่ง: ไวยากรณ์ส่งกลับชื่อของไฟล์ที่มีเนื้อหาเป็นผลมาจากการ<(COMMAND)
COMMAND
ทางออกที่ดีที่สุดสำหรับฉันถูกฝังอยู่ในความคิดเห็นของคำตอบของ @ 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
เมื่อใช้กับ เส้นที่ว่างเปล่าจะถูกนับ
git mktree </dev/null
หรือtrue|git mktree
หรือgit mktree <&-
หรือ :|git mktree
สำหรับการกดแป้น - ตัวนับในหมู่พวกเรา :-) - ต้นไม้ว่างเปล่าที่ลอยอยู่รอบ ๆ repo จะไม่ทำร้ายอะไรเลย
สิ่งนี้ทำงานได้ตั้งแต่cloc 1.68:
cloc --vcs=git
--vcs
ใช้งานไม่ได้สำหรับฉันบางทีมันอาจถูกลบออก cloc .
ในขณะที่ repo คอมไพล์ทำงาน OTOH
ฉันเล่นกับ 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
ฉันใช้สิ่งต่อไปนี้:
git grep ^ | wc -l
นี้จะค้นหาไฟล์ทั้งหมดที่มีเวอร์ชันโดย git สำหรับ regex ^
ซึ่งแสดงถึงจุดเริ่มต้นของบรรทัดดังนั้นคำสั่งนี้จะให้จำนวนบรรทัดทั้งหมด!
ฉันทำอย่างนี้:
git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l
สิ่งนี้ใช้งานได้หากคุณนับไฟล์ข้อความทั้งหมดในที่เก็บเป็นไฟล์ที่น่าสนใจ หากมีการพิจารณาเอกสารประกอบ ฯลฯ สามารถเพิ่มตัวกรองการยกเว้นได้
เครื่องมือนี้ใน github https://github.com/flosse/slocสามารถให้ผลลัพธ์ในลักษณะที่สื่อความหมายได้มากขึ้น มันจะสร้างสถิติของซอร์สโค้ดของคุณ:
ลอง:
find . -type f -name '*.*' -exec wc -l {} +
ในไดเรกทอรี / ไดเรกทอรีที่มีปัญหา
: | git mktree | git diff --shortstat --stdin
หรือ:
git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
ขึ้นอยู่กับว่าคุณต้องการรวมไฟล์ไบนารีหรือไม่มีสองวิธีแก้ไข
git grep --cached -al '' | xargs -P 4 cat | wc -l
git grep --cached -Il '' | xargs -P 4 cat | wc -l
"xargs -P 4" หมายความว่าสามารถอ่านไฟล์โดยใช้กระบวนการแบบขนานสี่กระบวนการ สิ่งนี้มีประโยชน์มากหากคุณกำลังสแกนที่เก็บข้อมูลขนาดใหญ่มาก ขึ้นอยู่กับความจุของเครื่องคุณอาจเพิ่มจำนวนกระบวนการ
-a ประมวลผลไฟล์ไบนารีเป็นข้อความ (รวมไบนารี)
-l '' แสดงเฉพาะชื่อไฟล์แทนบรรทัดที่ตรงกัน (สแกนเฉพาะไฟล์ที่ไม่ใช่ไฟล์เปล่า)
- ฉันไม่ตรงกับรูปแบบในไฟล์ไบนารี (ยกเว้นไบนารี)
--cached, ค้นหาในดัชนีแทนที่จะค้นหาในแผนผังงาน (รวมไฟล์ที่ไม่มีข้อผูกมัด)