Cập nhật
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Tôi đã cập nhật một số điều trên đường đi.
Để thuận tiện, bạn cũng có thể đặt lệnh này vào lệnh riêng của nó:
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
lưu trữ này ở đâu đó trong đường dẫn của bạn hoặc sửa đổi đường dẫn của bạn và sử dụng nó như
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Câu trả lời gốc
Trong khi câu trả lời được chấp nhận thực hiện công việc thì nó rất chậm.
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
là gần như tức thời.
Để có được danh sách các tập tin hiện đang theo dõi, bạn có thể sử dụng
git ls-tree --name-only -r HEAD
Giải pháp này tránh gọi file
để xác định filetype và sử dụng grep để khớp với phần mở rộng mong muốn vì lý do hiệu suất. Nếu tất cả các tập tin nên được bao gồm, chỉ cần loại bỏ điều này khỏi dòng.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
nếu các tệp có thể chứa dấu cách, có hại cho shell, bạn có thể sử dụng:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Đưa ra một danh sách các tập tin (thông qua một đường ống) người ta có thể sử dụng xargs để gọi một lệnh và phân phối các đối số. Các lệnh cho phép nhiều tệp được xử lý chấp nhận -n1
. Trong trường hợp này, chúng tôi gọi git blame --line-porcelain
và cho mỗi cuộc gọi, chúng tôi sử dụng chính xác 1 đối số.
xargs -n1 git blame --line-porcelain
Sau đó, chúng tôi lọc đầu ra cho các lần xuất hiện của "tác giả" sắp xếp danh sách và đếm các dòng trùng lặp theo:
grep "^author "|sort|uniq -c|sort -nr
Ghi chú
Các câu trả lời khác thực sự lọc ra các dòng chỉ chứa khoảng trắng.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
Lệnh trên sẽ in các tác giả của các dòng chứa ít nhất một ký tự không phải khoảng trắng. Bạn cũng có thể sử dụng kết hợp \w*[^\w#]
cũng sẽ loại trừ các dòng trong đó ký tự không phải khoảng trắng đầu tiên không phải là một #
(nhận xét bằng nhiều ngôn ngữ kịch bản).