Как я могу «оскорбить» вину (или какую-то более подходящую функцию и / или в сочетании с командами оболочки), чтобы дать мне статистику того, сколько строк (кода) в настоящее время находится в репозитории, исходящем от каждого коммиттера?
Пример вывода:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
Ответы:
Обновить
Я обновил некоторые вещи по пути.
Для удобства вы также можете поместить это в свою собственную команду:
сохраните это где-нибудь на своем пути или измените свой путь и используйте его как
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
Оригинальный ответ
Пока принятый ответ делает работу, он очень медленный.
почти мгновенно.
Чтобы получить список отслеживаемых файлов, вы можете использовать
Это решение позволяет избежать вызовов
file
для определения типа файла и использует grep для сопоставления с желаемым расширением по соображениям производительности. Если все файлы должны быть включены, просто удалите это из строки.если файлы могут содержать пробелы, что плохо для оболочек, вы можете использовать:
Дайте список файлов (через канал), можно использовать xargs для вызова команды и распределения аргументов. Команды, позволяющие обрабатывать несколько файлов, не допускают
-n1
. В этом случае мы вызываемgit blame --line-porcelain
и для каждого вызова мы используем ровно 1 аргумент.Затем мы фильтруем выходные данные по появлению «автора», сортируем список и подсчитываем повторяющиеся строки по:
Заметка
Другие ответы фактически отфильтровывают строки, которые содержат только пробелы.
Команда выше будет печатать авторов строк, содержащих хотя бы один непробельный символ. Вы также можете использовать совпадение,
\w*[^\w#]
которое также исключит строки, в которых первый непробельный символ отсутствует#
(комментарий на многих языках сценариев).источник
echo "a\nb\nc"|xargs -n1 cmd
будет расширяться доcmd a; cmd b; cmd d
git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
Я написал гем под названием git-fame, который может быть полезен.
Установка и использование:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
Вывод:
источник
Пошаговое объяснение:
Перечислите все файлы под контролем версий
Сократить список до только текстовых файлов
Git обвиняет все текстовые файлы, игнорируя изменения пробелов
Вытащите имена авторов
Сортировать список авторов и подсчитать количество последовательно повторяющихся строк.
Пример вывода:
источник
sed
версия, моя не понимает-r
флаг и имеет проблемы с регулярным выражением (жалуется на несбалансированные парены, даже когда я удаляю излишки(
).sudo brew install gnu-sed
решил это. Работает как шарм!port install gsed
для пользователей MacPorts.sudo brew install gnu-sed
(который работал), но я все еще получаю ошибки, которые sed не распознает -r. :(git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
git summary
обеспечивается GIT-статисты пакет именно то , что вам нужно. Ознакомьтесь с документацией в git-extras - git-summary :Дает вывод, который выглядит следующим образом:
источник
Решение Эрика было потрясающим, но у меня были некоторые проблемы с диакритическими знаками (несмотря на то, что мои
LC_*
переменные окружения были якобы правильно установлены) и утечкой шума в строках кода, в которых действительно были даты. Мой sed-fu беден, поэтому я получил этот фрагмент Франкенштейна с рубином, но он работает для меня безупречно на 200 000+ LOC и сортирует результаты:Кроме того, обратите внимание ,
gsed
вместо того ,sed
потому что бинарные доморощенные Установки, оставляя систему СЭДА нетронутой.источник
git shortlog -sn
Это покажет список коммитов на автора.
источник
Вот основной фрагмент ответа @Alex, который фактически выполняет операцию агрегации линий обвинения. Я сократил его, чтобы работать с одним файлом, а не с набором файлов.
Я публикую это здесь, потому что я часто возвращаюсь к этому ответу, перечитываю пост и перевариваю примеры, чтобы извлечь часть, которую я оцениваю, которая облагается налогом. И при этом это не достаточно универсально для моего случая использования; его объем для всего проекта C.
Мне нравится перечислять статистику по каждому файлу, полученную с помощью
for
итератора bash, а не так,xargs
как я нахожу xargs менее читабельными и сложными в использовании / запоминании. Преимущества / недостатки xargs vs для должны обсуждаться в другом месте.Вот практический фрагмент, который покажет результаты для каждого файла в отдельности:
И я проверил, что запуск этого режима в оболочке bash безопасен ctrl + c, если вам нужно поместить его в сценарий bash, вам может понадобиться перехватывать SIGINT и SIGTERM, если вы хотите, чтобы пользователь мог разорвать цикл for.
источник
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nr
Найден небольшая подстройка кgit blame
здесь , что более точно изображает статистику я искал. В частности, опции -M и -C -C (это два C по назначению). -M обнаруживает перемещения внутри файла, а -C -C обнаруживает скопированные строки из других файлов. Смотрите документ здесь . Для полноты, -w игнорирует пробелы.Проверьте команду gitstats, доступную на http://gitstats.sourceforge.net/
источник
У меня есть это решение, которое подсчитывает обвиняемые строки во всех текстовых файлах (исключая двоичные файлы, даже версионные):
источник
Это работает в любом каталоге исходной структуры репозитория, если вы хотите проверить определенный исходный модуль.
источник
Я принял главный ответ на Powershell:
Необязательно, работаете ли вы
git blame
с-w
коммутатором, я добавил его, потому что он игнорирует изменения пробелов.Производительность на моей машине была в пользу Powershell (~ 50 с против ~ 65 с для того же репо), хотя решение Bash работало под WSL2
источник
Сделал свой собственный скрипт, который представляет собой комбинацию @nilbus и @Alex
источник
enter code here
вызывала проблемы .... это работает правильно?Функция Bash, предназначенная для одного исходного файла, запускается в MacOS.
источник