Gitで最も変更されたファイルを見つける


105

最も頻繁に変更されるファイルをGitで表示するにはどうすればよいですか?

回答:


45

git effortgit-extrasパッケージから)コマンドを使用して、ファイルごとのコミット数(コミット数とアクティブな日数)に関する統計を表示できます。

EDIT:gitの努力があるだけで bashスクリプトあなたがここに見つけることができるとあなたはもっと特別な何かが必要な場合は、あなたのニーズに適応します。


出力は2部構成になり、最初に並べ替えられていない結果が得られ、次に並べ替えられた(色分けされた)結果が得られます。正しい?
アンディ

@Andyのようです(git help effortそれに関する情報はありません:/)。最初の結果セットはファイル名で並べられ、2番目の結果セットはファイルごとのコミット数で並べられていると思います。manページには、問題を報告するためのgithub.com/tj/git-extras/issuesについても記載れています
Asenar

これはこれに似ていますか?blog.riff.org/...

155

次のようなことができます:

git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10

ログは各コミットで変更されたファイルの名前を出力するだけですが、残りのログはソートして、最も頻繁に出現するファイル名の上位10件を出力します。


これが現在のブランチに基づいているのか、リポジトリ全体に基づいているのか教えていただけますか?まだマージされていないブランチはどうですか?
Karthick S 2013

@KarthickS:のみ現在のブランチのコミットのためだ-あなたが追加できる--branchesまでgit log、あなたの地元の支店のいずれかのコミットを含めたい場合。
Mark Longair 2013年

1
いいね。また、ずっと前に削除されたレポートファイルも見つけました。たとえば、
-since

2
--since "1 month ago"または、その他のオプションを使用して時間枠を絞り込むことも役立ちます

3
私の答えの一部が見つかりました:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331

13

Markseheのどちらの 回答も--followファイルではないことに気付きました。つまり 、ファイルの名前が変更されると停止します。このスクリプトははるかに遅くなりますが、その目的のために機能します。

git ls-files |
while read aa
do
  printf . >&2
  set $(git log --follow --oneline "$aa" | wc)
  printf '%s\t%s\n' $1 "$aa"
done > bb
echo
sort -nr bb
rm bb

git-most.sh


1
これを拡張するために、私はgist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350を作成しました。 これは、フォルダーごと、特にrolesディレクトリ内の各フォルダーごとの変更を集約しますが、ユースケースに合わせて簡単に変更できます。
Almenon

3

powershellの場合、git bashがインストールされていると仮定します

git log --pretty=format: --name-only | sort | uniq -c | sort -Descending | select -First 10

3

これはWindows版です

git log --pretty=format: --name-only  > allfiles.csv

その後、Excelで開きます

A1: FileName
A2: isVisibleFilename  >> =IFERROR(IF(C2>0,TRUE,FALSE),FALSE)
A3: DotLocation >> =FIND("@",SUBSTITUTE(A2,".","@",(LEN(A2)-LEN(SUBSTITUTE(A2,".","")))/LEN(".")))
A4: HasExt       >> =C2>1
A5: TYPE        >> =IF(D2=TRUE,MID(A2,C2+1,18),"")

ピボットテーブルを作成する

values: Type
  Filter: isFilename = true
  Rows : Type
  Sub : FileName

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest

Excelについてはあまり詳しくないので、これらの説明は理解できません。
BigMiner

2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

ファイルのみを表示したい場合は、に追加--authorしてくださいgit whatchanged --author=name --all


1

古い質問ですが、それでも非常に役立つ質問だと思います。これは、まっすぐなpowershellでの動作例です。これにより、現在のブランチに関して、リポジトリ内で最も変更された上位10個のファイルが取得されます。

git log --pretty=format: --name-only | Where-Object { ![string]::IsNullOrEmpty($_) } | Sort-Object | Group-Object  | Sort-Object -Property Count -Descending | Select-Object -Property Count, Name -First 10

0

たとえば、2つのコミットまたはブランチ間で変更されたファイルを見つけることもできます。

git log  --pretty=format: --name-only <source_branch>...<target_branch> | sort | uniq -c | sort -rg | head -50 

0

これはおそらく明白ですが、提供されるクエリはすべてのファイルを表示しますが、おそらく、構成またはプロジェクトファイルが最も更新されていることを知りたくないでしょう。単純なgrepは、コードファイルに分離します。次に例を示します。

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.