Как определить частоту смены кода?

Я работаю над программой, написанной несколькими людьми с разным уровнем квалификации. Там есть файлы, которые никогда не менялись (и, вероятно, никогда не изменится, поскольку мы боимся их трогать), и другие, которые постоянно меняются.

Интересно, есть ли инструменты, которые бы смотрели всю историю репо (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 

Это даст вам облако тегов с файлами, которые больше будут отображаться.

Если вы ищете решение для ОС, я бы, вероятно, подумал о том, чтобы начать с gitstats и посмотреть на его расширение, собирая журналы файлов и агрегируя эти данные.

Я бы посмотрел на 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

Надеюсь, поможет.

Другие вопросы по тегам