Поиск наиболее измененных файлов в Git

105

Как в Git показать файлы, которые меняются чаще всего?

Себастьян
источник

Ответы:

45

вы можете использовать команду git effort(из git-extrasпакета), которая показывает статистику о количестве коммитов для каждого файла (по коммитам и активным дням).

РЕДАКТИРОВАТЬ: git усилия - это просто сценарий bash, который вы можете найти здесь и адаптировать к своим потребностям, если вам нужно что-то более особенное.

Асенар
источник
Вывод будет разделен на две части: сначала вы получите несортированные результаты, затем отсортированные (и цветные) результаты. Правильно?
Энди
@ Энди, похоже (и git help effortне имеет об этом информации: /). Я предполагаю, что первый набор результатов упорядочен по имени файла, а второй - по количеству фиксации для каждого файла. На странице
руководства
это похоже на это? blog.riff.org/…
155

Вы можете сделать что-то вроде следующего:

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

Журнал просто выводит имена файлов, которые были изменены в каждой фиксации, в то время как остальная часть просто сортирует и выводит 10 наиболее часто встречающихся имен файлов.

Марк Лонгэр
источник
Не могли бы вы сказать мне, основано ли это на текущей ветке или для всего репозитория? А как насчет ветвей, которые еще не объединены?
Karthick S 05
@KarthickS: это только для коммитов в текущей ветке - вы можете добавить --branchesв, git logесли хотите включить коммиты в любую из ваших локальных веток.
Марк Лонгэр 06
1
Ницца. Кроме того, я обнаружил, что он также сообщает файл, который был удален давно. Быстрое исправление заключалось в ограничении времени, например: --since = "в прошлом году"
FractalSpace
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

Я заметил, что ответы Марка и Сехе не относятся--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
Hyeomans
источник
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.

Энди
источник
2

Старый вопрос, но я думаю, что это очень полезный вопрос. Вот рабочий пример в формате 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

Мы также можем узнать файлы, измененные между двумя коммитами или ветвями, например

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
Реджинальд Блю
источник