Есть ли команда, которую я могу вызвать, которая будет подсчитывать количество строк, измененных конкретным автором в репозитории Git? Я знаю, что должны быть способы подсчета количества коммитов, как это делает Github для своего графика воздействия.
458
git://git.lwn.net/gitdm.git
.Ответы:
Вывод следующей команды должен быть достаточно простым для отправки в скрипт для суммирования итогов:
Это дает статистику для всех коммитов на текущем заголовке. Если вы хотите добавить статистику в другие ветки, вам нужно будет предоставить их в качестве аргументов
git log
.Для перехода к сценарию удаление даже формата «oneline» может быть сделано с пустым форматом журнала, и, как прокомментировал Якуб Наребски,
--numstat
это еще одна альтернатива. Он генерирует для каждого файла, а не для каждой строки статистику, но его еще проще анализировать.источник
--numstat
вместо,--shortstat
если вы хотите добавить статистику немного проще.git help log
говорит мне, что первые строки добавлены, вторые строки удалены.Это дает некоторую статистику об авторе, изменяя при необходимости.
Используя Gawk:
Использование Awk на Mac OSX:
РЕДАКТИРОВАТЬ (2017)
На github есть новый пакет, который выглядит гладко и использует bash в качестве зависимостей (протестировано на linux). Это больше подходит для непосредственного использования, чем сценарии.
Это git-quick-stats (ссылка на github) .
Скопируйте
git-quick-stats
в папку и добавьте папку в путь.Применение:
источник
gawk
его,awk
чтобы заставить его работать в терминале OSXgit clone https://github.com/arzzen/git-quick-stats.git
На случай, если кто-то захочет увидеть статистику по каждому пользователю в своей кодовой базе, пара моих коллег недавно придумали эту ужасную строку:
(Занимает несколько минут, чтобы пройти через наш репо, который имеет около 10-15 тыс. Коммитов.)
источник
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Git Fame https://github.com/oleander/git-fame-rb
хороший инструмент для подсчета всех авторов сразу, включая фиксацию и изменение файлов:
Также есть версия Python по адресу https://github.com/casperdcl/git-fame (упомянутая @fracz):
Пример вывода:
Но будьте осторожны: как упомянул Джаред в комментарии, выполнение этого в очень большом хранилище займет часы. Не уверен, что это можно улучшить, учитывая, что он должен обрабатывать так много данных Git.
источник
git fame --branch=dev --timeout=-1 --exclude=Pods/*
Мне показалось полезным следующее, чтобы узнать, у кого больше всего строк в базе кода:
Другие ответы в основном касались строк, измененных в коммитах, но если коммиты не сохранились и были перезаписаны, они могли быть просто оттоками. Вышеупомянутое заклинание также позволяет отсортировать всех коммиттеров по строкам, а не по одному за раз. Вы можете добавить некоторые параметры в git blame (-C -M), чтобы получить более точные числа, которые учитывают перемещение файлов и перемещение строк между файлами, но команда может выполняться намного дольше, если вы это сделаете.
Кроме того, если вы ищете строки, измененные во всех коммитах для всех коммиттеров, вам пригодится следующий небольшой скрипт:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
источник
/^.*\((.*?)\s[\d]{4}/
должно быть,/^.*?\((.*?)\s[\d]{4}/
чтобы предотвратить совпадение скобок в источнике, как автор.Для подсчета количества коммитов данного автора (или всех авторов) в данной ветке вы можете использовать git-shortlog ; особенно посмотрите его
--numbered
и его--summary
параметры, например, при запуске в git-репозитории:источник
v1.6.4
здесь, в этом примере, чтобы сделать вывод детерминированным: он будет одинаковым независимо от того, когда вы клонировали и / или выбирали из репозитория git.v1.6.4
дает мне:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
или, если вы не хотите включать слиянияgit shortlog -sne --no-merges
-s
есть--summary
,-n
есть--numbered
, и [новый]-e
является ,--email
чтобы показать электронные письма авторов (и подсчитывать отдельно того же автор с другим адресом электронной почты, с учетом.mailmap
поправок). Хороший звонок--no-merges
.Посмотрев на ответ Алекса и Gerty3000 , я попытался укоротить одну строку :
В основном, используя git log numstat и не отслеживая количество измененных файлов .
Git версии 2.1.0 на Mac OSX:
Пример:
источник
Ответ от AaronM с помощью оболочки Однострочника хорошо, но на самом деле, есть еще одна ошибка, где пробела испортят имена пользователей , если есть различные количества пробелов между именем пользователя и датой. Поврежденные имена пользователей приведут к нескольким строкам для подсчета пользователей, и вы должны суммировать их самостоятельно.
Это небольшое изменение исправило проблему для меня:
Обратите внимание на знак + после \ s, который будет использовать все пробелы от имени до даты.
На самом деле, добавив этот ответ так же, как для моей памяти, так и для помощи кому-либо еще, так как это по крайней мере второй раз, когда я гуглю тему :)
--show-email
вgit blame -w
агрегировать по электронной почте вместо этого, так как некоторые люди используют различныеName
форматы на разных компьютерах, а иногда и два человека с одинаковым именем работают в одной и той же мерзавцем.источник
unsupported file type
но в остальном он работает нормально даже с ними (он их пропускает).Вот короткая строка, которая производит статистику для всех авторов. Это намного быстрее, чем приведенное выше решение Дэна на https://stackoverflow.com/a/20414465/1102119 (у меня сложность по времени O (N) вместо O (NM), где N - количество коммитов, а M - количество авторов). ).
источник
--no-show-signature
, иначе люди, которые подписывают свои коммиты pgp, не будут засчитаны.count-lines = "!f() { git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = \"\"; next } END { for (a in ins) { printf \"%10d %10d %10d %s\\n\", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn; }; f"
. (Обратите внимание, я нахожусь на Windows; возможно, вам придется использовать различные виды цитат)@mmrobins @AaronM @ErikZ @JamesMishra предоставил варианты, которые имеют общую проблему: они просят git выдать смесь информации, не предназначенной для использования скриптами, включая содержимое строки из хранилища в одной строке, а затем сопоставляют беспорядок с регулярным выражением. ,
Это проблема, когда некоторые строки не являются допустимым текстом UTF-8, а также когда некоторые строки соответствуют регулярному выражению (это произошло здесь).
Вот модифицированная строка, которая не имеет этих проблем. Он запрашивает git для чистого вывода данных в отдельных строках, что позволяет легко фильтровать то, что нам нужно:
Вы можете использовать grep для других строк, таких как почта автора, коммиттер и т. Д.
Возможно, сначала сделайте
export LC_ALL=C
(предполагаяbash
) форсировку обработки на уровне байтов (это также очень сильно ускоряет grep из локалей на основе UTF-8).источник
Решение было дано с ruby посередине, поскольку perl немного более доступен по умолчанию, это альтернатива использованию perl для текущих строк автора.
источник
В дополнение к ответу Чарльза Бейли , вы можете добавить
-C
параметр в команды. В противном случае переименования файлов считаются множеством добавлений и удалений (столько, сколько в файле есть строки), даже если содержимое файла не было изменено.Для иллюстрации приведем коммит с множеством файлов, перемещаемых из одного из моих проектов при использовании
git log --oneline --shortstat
команды:И здесь тот же коммит, используя
git log --oneline --shortstat -C
команду, которая обнаруживает копии файлов и переименовывает:По моему мнению, последний дает более реалистичное представление о том, какое влияние оказал человек на проект, потому что переименование файла - это гораздо меньшая операция, чем запись файла с нуля.
источник
Вы можете использовать whodid ( https://www.npmjs.com/package/whodid )
а также
или просто введите
тогда вы можете увидеть результат, как это
источник
-g
должен был прийти перед именем пакета, наmacOS
. Просто пытаюсь помочь.Вот быстрый скрипт ruby, который сопоставляет воздействие на пользователя с данным запросом журнала.
Например, для рубиния :
сценарий:
источник
это лучший способ, и он также дает вам четкое представление об общем количестве коммитов всеми пользователями
источник
Я предоставил модификацию короткого ответа выше, но этого было недостаточно для моих нужд. Мне нужно было иметь возможность классифицировать как зафиксированные строки, так и строки в конечном коде. Я также хотел разбить файл. Этот код не повторяется, он будет возвращать результаты только для одного каталога, но это хорошее начало, если кто-то хочет пойти дальше. Скопируйте и вставьте в файл и сделайте исполняемым или запустите его с Perl.
источник
Для пользователей Windows вы можете использовать следующий пакетный скрипт, который считает добавленные / удаленные строки для указанного автора
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
источник
Вот отличный репо, который делает вашу жизнь проще
git-quick-stats
На макинтоше с установленным напитком
brew install git-quick-stats
Запустить
git-quick-stats
Просто выберите, какой вариант вы хотите из этого списка, набрав номер в списке и нажав Enter.
источник
Этот скрипт здесь сделает это. Поместите его в authorhip.sh, chmod + x, и все готово.
источник
Сохраните ваши журналы в файл, используя:
Для любителей Python:
Ваши результаты будут такими:
источник
Вы хотите, чтобы Git вину .
Есть опция --show-stats для печати некоторой статистики.
источник
blame
, но это не давало статистику, которая, как я думал, понадобится ОП?В вопросе запрашивалась информация о конкретном авторе, но многие из ответов были решениями, которые возвращали ранжированные списки авторов на основе измененных строк кода.
Это было то, что я искал, но существующие решения были не совсем идеальными. В интересах людей, которые могут найти этот вопрос через Google, я внес в них некоторые улучшения и превратил их в сценарий оболочки, который я отображаю ниже. Аннотированный (который я буду продолжать поддерживать) можно найти на моем Github .
Нет никаких зависимостей ни от Perl, ни от Ruby. Кроме того, пробел, переименования и движения строк учитываются при подсчете изменений строк. Просто поместите это в файл и передайте Git-репозиторий в качестве первого параметра.
источник
Лучший инструмент, который я до сих пор опознал, это gitinspector. Он дает установленный отчет для каждого пользователя, за неделю и т. Д. Вы можете установить, как показано ниже, с помощью npm.
npm install -g gitinspector
Ссылки, чтобы получить более подробную информацию
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
примеры команд
источник
Я написал этот скрипт на Perl для выполнения этой задачи.
Я назвал это
git-line-changes-by-author
и положил в/usr/local/bin
. Поскольку он сохраняется на моем пути, я могу выполнить команду,git line-changes-by-author --before 2018-12-31 --after 2020-01-01
чтобы получить отчет за 2019 год. Например. И если бы я ошибся, название git предложит правильное написание.Вы можете настроить
_get_repo_slug
сабвуфер так, чтобы он включал только последнюю часть, такremote.origin.url
как мои репозитории сохраняются, аproject/repo
ваши нет.источник