2012-02-22 2 views
25

私は、技術レベルが大きく異なるいくつかの人々によって書かれたプログラムに取り組んでいます。そこには決して変更されていない(おそらく、私たちがそれらに触れることを恐れているような)ファイルや、絶えず変化しているファイルがあります。コードの変更頻度を検出するにはどうすればよいですか?

リポジトリ履歴全体(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 

これは、より多くの文字列を表示するファイルを含むタグクラウドを提供します。前の回答に

+2

2番目のビットは実際にはうまくスケールされません。 'sort file-changes.txt | uniq -c | sed -e 's/^ * //' -e 's// 0、/'> heatmap.in'またはその効果の方が速いはずです。 – cdegroot

11

OSソリューションをお探しの場合は、おそらくgitstatsから始まり、ファイルログを取得してそのデータを集約することで拡張を検討してください。

+1

私はgitstatsの 'merge_authors'機能を特に賞賛しました。これは、同じ人物が異なる著者名の下でコミットした場合にクリーンアップを可能にします。 cf https://gitorious.org/gitstats/mainline/commit/005fe0bbcab967367e4932d11b161f9f0f71cf7f –

4

私はあなたの(名前の変更を含む)の歴史の中のファイルに起こったすべての変更を行います

git log --follow -p file 

のようなコマンドを使用してお勧めします。あなたは、ファイルを変更しコミットの数を取得したい場合、あなたは、UNIXベースのOS上で行うことができます。

git log --follow --format=oneline Gemfile | wc -l 

その後、脇名で複数のファイルにこれを適用するにはbashスクリプトを作成することができます。

希望しました!

+0

それほどエレガントではありませんが、単純で実用的な解決策(1+)。 – AoeAoe

+0

本当にいいです。ありがとう! – Ashitaka

8

私はNChurnを見てしたい:

NChurnは リポジトリ内のファイルのロバチャーンレベルを支援するユーティリティです。チャーンは、どのファイルが変更されたかを検出するのに役立ちます。 の寿命が最も長くなります。これは潜在的なバグのハイブを識別するのに役立ちます。 不適切な設計。最も良いことはNchurnをビルド に組み込み、各実行の履歴を保存することです。次に、 リポジトリの解約の進化をプロットすることができます。

+0

+1;これがgitstatsに統合されているのを見てうれしいです。 –

+0

NChurnはうまく動作し、高速動作します。レポ内の日付範囲のファイルごとのチェックイン数を数えます。 (これには、簡単なNPE修正が必要です。または、「除外」リストを必ず含めてください)。 –

2

ビルは私はあなたがfile_churnとしてスクリプトを呼び出した場合は、すべてのプロジェクトファイル

#!/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 .. 

を解析するために、次のスクリプトを示唆しています。あなたのgitプロジェクトのディレクトリを解析することができます

> ./file_churn.sh project_dir 

私は助けてくれることを願っています。