Подсчет строк кода на автора в репозитории git

Итак, я в команде с несколькими другими программистами, и мне нужно получить количество строк кода на каждого автора в нашем репозитории git. Это означает не только строки, измененные автором, потому что это будет включать пустые строки и строки комментариев. В идеале я мог бы создать новую ветку, содержащую только коммиты определенного автора (--author="BtheDestroyer" для себя), а затем использовать cloc, чтобы отдельно получить количество строк комментариев и количество строк кода. я пытался использовать

git log --author="BtheDestroyer" --format=%H > mycommits
git checkout --orphan mycommits
tac mycommits| while read sha; do git cherry-pick --no-commit ${sha}; done

однако во время последней строки я получаю массу следующих ошибок:

filepath: unmerged (commit-id-1)
filepath: unmerged (commit-id-2)
error: your index file is unmerged.
fatal: cherry-pick failed

Я также не уверен, что это приведет к быстрой переадресации через другие коммиты в процессе. Любые идеи?


person BtheDestroyer    schedule 08.10.2017    source источник


Ответы (1)


Отвечая на мой собственный вопрос:

В итоге я использовал git blame и сценарий оболочки Bourne для циклического просмотра различных файлов в исходной папке, преобразования их обратно в код с использованием grep и cut, организации вывода во временные файлы, а затем запускал cloc для этого.

Вот мой сценарий оболочки для тех, кто хочет сделать что-то подобное (у меня он есть в ./Blame/, поэтому измените SOURCE соответствующим образом!):

#!/bin/bash
#Name of user to check
#  If you have multiple usernames, separate them with a space
#  The full name is not required, just enough to not be ambiguous
USERS="YOUR USERNAMES HERE"
#Directories
SOURCE=../source

for USER in $USERS
do
    #clear blame files
    echo "" > $USER-Blame.h
    echo "" > $USER-Blame.cpp
    echo "" > $USER-Blame.sh
    echo "Finding blame for $USER..."
    #C++ files
    echo "  Finding blame for C++ files..."
    for f in $SOURCE/*.cpp
    do
        git blame "$f" | grep "$USER" | cut -c 70- >> "$USER-Blame.cpp"
    done
    #Header files
    echo "  Finding blame for Header files..."
    for f in $SOURCE/*.h
    do
        git blame "$f" | grep "$USER" | cut -c 70- >> "$USER-Blame.h"
    done
    #Shell script files
    echo "  Finding blame for shell script files..."
    for f in ./GetUSERBlame.sh
    do
        git blame "$f" | grep "$USER" | cut -c 70- >> "$USER-Blame.sh"
    done
done

for USER in $USERS
do
#cloc
echo "Blame for all users found! Cloc-ing $USER..."
cloc $USER-Blame.* --quiet
#this line is for cleaning up the temporary files
#if you want to save them for future reference, comment this out.
rm $USER-Blame.* -f
done
person BtheDestroyer    schedule 08.10.2017