Как определить частоту смены кода?
Я работаю над программой, написанной несколькими людьми с разным уровнем квалификации. Там есть файлы, которые никогда не менялись (и, вероятно, никогда не изменится, поскольку мы боимся их трогать), и другие, которые постоянно меняются.
Интересно, есть ли инструменты, которые бы смотрели всю историю репо (git
) и произвести анализ того, как часто данный файл изменяется? Или пакет? Или проект?
Было бы полезно признать, что (например) мы потратили 25% нашего времени, работая над набором пакетов, что может указывать на хрупкость кода по сравнению с кодом, который "просто работает".
5 ответов
Я написал кое-что, что мы используем, чтобы визуализировать эту информацию успешно.
https://github.com/bcarlso/defect-density-heatmap
Посмотрите на проект, и вы можете увидеть, как выглядит результат в файле readme.
Вы можете делать то, что вам нужно, сначала получая список файлов, которые были изменены в каждом коммите из Git.
~ $ git log --pretty="format:" --name-only | grep -v ^$ > file-changes.txt
~ $ for i in `cat file-changes.txt | cut -d"." -f1,2 | uniq`; do num=`cat file-changes.txt | grep $i | wc -l`; if (( $num > 1 )); then echo $num,0,$i; fi; done | heatmap > results.html
Это даст вам облако тегов с файлами, которые больше будут отображаться.
Я бы посмотрел на NChurn:
NChurn - это утилита, которая помогает оценить уровень оттока ваших файлов в вашем хранилище. Отток может помочь вам определить, какие файлы изменились больше всего за время их жизни. Это помогает выявить потенциальные ошибки и неправильный дизайн. Лучше всего подключить NChurn к процессу сборки и сохранять историю каждого запуска. Затем вы можете построить график оттока вашего хранилища.
Я предлагаю использовать такую команду
git log --follow -p file
Это даст вам все изменения, которые произошли с файлом в истории (включая переименования). Если вы хотите получить количество коммитов, которые изменили файл, вы можете сделать это на ОС UNIX:
git log --follow --format=oneline Gemfile | wc -l
Затем вы можете создать скрипт bash, чтобы применить его к нескольким файлам с именем в стороне.
Надеюсь, это помогло!
Основываясь на предыдущем ответе, я предлагаю следующий скрипт для разбора всех файлов проекта
#!/bin/sh
cd $1
find . -path ./.git -prune -o -name "*" -exec sh -c 'git log --follow --format=oneline $1 | wc -l | awk "{ print \$1,\"\\t\",\"$1\" }" ' {} {} \; | sort -nr
cd ..
Если вы вызываете скрипт как file_churn.sh, вы можете проанализировать вызов каталога вашего git-проекта.
> ./file_churn.sh project_dir
Надеюсь, поможет.