Recherche de la plupart des fichiers modifiés dans Git

105

Comment puis-je afficher les fichiers dans Git qui changent le plus souvent?

Sébastien
la source

Réponses:

45

vous pouvez utiliser la commande git effort(à partir du git-extraspackage) qui affiche des statistiques sur le nombre de commits par fichiers (par commits et jours actifs).

EDIT: git effort est juste un script bash que vous pouvez trouver ici et adapter à vos besoins si vous avez besoin de quelque chose de plus spécial.

Asenar
la source
La sortie sera en deux parties, vous obtenez d'abord les résultats non triés, puis les résultats triés (et colorés). Droite?
Andy
@Andy il semble (et git help effortn'a aucune information à ce sujet: /). Je suppose que le premier ensemble de résultats est trié par nom de fichier et le second par numéro de commit par fichier. La page de manuel mentionne également github.com/tj/git-extras/issues pour signaler les problèmes
Asenar
est-ce similaire à cela? blog.riff.org
155

Vous pouvez faire quelque chose comme ceci:

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

Le journal affiche simplement les noms des fichiers qui ont été modifiés à chaque commit, tandis que le reste trie et affiche simplement les 10 noms de fichiers les plus fréquents.

Mark Longair
la source
Pouvez-vous me dire si cela est basé sur la branche actuelle ou si c'est pour l'ensemble du référentiel? Qu'en est-il des succursales non encore fusionnées?
Karthick S
@KarthickS: c'est uniquement pour les commits dans la branche actuelle - vous pouvez ajouter --branchesà git logsi vous souhaitez inclure des commits sur l'une de vos branches locales.
Mark Longair
1
Agréable. En outre, j'ai trouvé qu'il signale également des fichiers qui ont été supprimés il y a longtemps. La solution rapide était de limiter le temps, par exemple: --since = "l'année dernière"
FractalSpace
2
également utile est d'utiliser --since "1 month ago"ou d'autres options pour réduire la fenêtre de temps
3
J'ai trouvé une partie de ma réponse:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331
13

J'ai remarqué que les réponses de Mark et de sehe ne --followconcernent pas les fichiers, c'est-à-dire qu'elles s'arrêtent une fois qu'elles atteignent un fichier renommé. Ce script sera beaucoup plus lent, mais fonctionnera dans ce but.

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

Steven Penny
la source
1
Pour développer cela, j'ai créé gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350 Il regroupe les modifications par dossier, en particulier par chaque dossier du rolesrépertoire pour mon cas, mais est facilement modifié pour s'adapter à votre cas d'utilisation.
Almenon
3

Pour PowerShell, en supposant que git bash soit installé

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

Ceci est une version Windows

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

puis ouvrir dans 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),"")

créer un tableau croisé dynamique

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

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest
Mickey Perlstein
la source
Parce que je ne connais pas grand-chose à Excel, je ne comprends pas ces instructions.
BigMiner
2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

Si vous souhaitez uniquement voir vos fichiers ajouter --authorà git whatchanged --author=name --all.

Andy
la source
1

Ancienne question, mais je pense encore une question très utile. Voici un exemple de travail en PowerShell droit. Cela obtiendra les 10 fichiers les plus modifiés dans votre dépôt par rapport à la branche sur laquelle vous vous trouvez.

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
Omar Rodriguez
la source
0

Nous pouvons également trouver des fichiers modifiés entre deux commits ou branches, par exemple

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

C'est probablement évident, mais les requêtes fournies afficheront tous les fichiers, mais peut-être que vous n'êtes pas intéressé de savoir que vos fichiers de configuration ou de projet sont les plus à jour. Un simple grep isolera vos fichiers de code, par exemple:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
Bleu Reginald
la source