2014-09-15 16 views
7

Podczas gdy git-blame i counting number of lines changed przez autora w repozytorium git są pomocne, czy istnieje polecenie, które może wyświetlić listę wszystkich nazw ścieżek zmodyfikowanych w repo po wszystkich zatwierdzeniach przez autora lub zestaw autorów, którzy ocenili każdy plik przez liczbę zobowiązuje się do tego autor lub zestaw autorów? Na przykład. wynik działania takiego polecenia w klonowanym reporze git będzie podobny do:Jak liczyć liczbę zatwierdzeń na ścieżkę do pliku według autora w repozytorium Git?

1 /path/to/some/file/in/repo/file1 
34 /path/to/some/file/in/repo/file2 
3 /path/to/some/other/file/in/repo/anotherfile 
... 

Dzięki!

+1

Idziesz do podejmowania decyzji płacowych? – Basilevs

+0

:) Nie. Chciałem tylko zidentyfikować części kodu, na których można się skupić, a użycie # commitów na plik przez autora byłoby jednym ze sposobów identyfikacji części kodu, na których należy się skupić w celu transferu wiedzy, gdy pracownik odchodzi. –

+0

Czy chcesz napisać plik wsadowy? Jeśli tak, możesz użyć 'git rev-list HEAD --count --author = someDude - somefile.txt', aby utworzyć wynik liczenia. –

Odpowiedz

10

sobie sprawę, że jeśli używasz --name-only wydrukować nazwy plików, format ładna jak pusty ciąg i używać this method do sortowania, Uniq i sortuj według maksymalnej liczby zatwierdzeń, w * nix/OS X, możesz użyć:

git log --name-only --author=John --pretty=format: | sort | uniq -c | sort -nr 

Be sur e używasz właściwego autora.

E.g. jeśli staraliśmy się znaleźć autorów DHH w Rails, możemy zrobić:

git log --format='%aN <%aE>' | LC_ALL='C' sort -u | grep avid 

i zauważ, że wszyscy autorzy DHH jest w git repo Rails używać nazwy „David Heinemeier Hansson”.Tak więc możemy zrobić:

git log --name-only --author="David Heinemeier Hansson" --pretty=format: | sort | uniq -c | sort -nr 

które mogą wyjście:

3624 
611 actionpack/CHANGELOG 
432 activerecord/CHANGELOG 
329 railties/CHANGELOG 
206 activerecord/lib/active_record/base.rb 
195 activesupport/CHANGELOG 
157 actionpack/lib/action_controller/base.rb 
153 railties/Rakefile 
108 activerecord/lib/active_record/associations.rb 
    79 actionpack/lib/action_view/helpers/javascript_helper.rb 
    75 activerecord/lib/active_record/validations.rb 
    74 activerecord/test/base_test.rb 
    69 actionmailer/CHANGELOG 
    66 railties/lib/rails_generator/generators/applications/app/app_generator.rb 
    66 activerecord/Rakefile 
    66 actionpack/lib/action_controller/caching.rb 
    60 actionpack/lib/action_controller/routing.rb 
    59 railties/lib/initializer.rb 
    59 actionpack/Rakefile 
    57 actionpack/lib/action_controller/request.rb 
    ... 

tak, jak z 2015-02-21, było 3624 plików w szynach git repo, że wydaje się, że nigdy osobiście dokonano zatwierdzenia, najwyższa liczba zatwierdzeń dla pliku to ActionPack CHANGELOG przy zatwierdzeniu 611, a następnie ActiveRecord CHANGELOG, a ActiveRecord :: Base to plik Ruby, do którego najbardziej się zobowiązał.

Jeśli chcesz wykluczyć liczbę plików nie dotykały z hrabiów, użyj --format= zamiast --pretty=format:, np .:

git log --name-only --author="David Heinemeier Hansson" --format: | sort | uniq -c | sort -nr 
+0

To jest niesamowite i naprawdę mi pomogło. Dziękuję Ci! –

2

Przykład z PowerShell

wyświetlić licznik określonego autora popełnić dla każdego pliku w bieżącym drzewie roboczym.

Short Form

$author = 'shaun'; 
dir -r | % { New-Object PSObject -Property ` 
@{ ` 
    Count = git rev-list HEAD --count --author=$author -- $_.Name; ` 
    FileName = $_.Name; ` 
}} ` 
| sort Count | % { $_.Count + ' -- ' + $_.FileName + ' -- ' + $author; } 

długa forma

$author = 'shaun'; ` 
Get-ChildItem -recurse | ForEach-Object ` 
{ ` 
    New-Object PSObject -Property ` 
    @{ ` 
     Count = git rev-list HEAD --count --author=$author -- $_.Name; ` 
     FileName = $_.Name; ` 
    } ` 
} | ` 
Sort-Object Count | ForEach-Object ` 
{ ` 
    $_.Count + ' -- ' + $_.FileName + ' -- ' + $author; ` 
} 

Uwagi

  • ` środki kontynuować polecenie w nowej linii.
  • | oznacza potok obiektów wynikowych do następnego polecenia.
  • $_.SomeProperty uzyskuje dostęp do właściwości z wyprowadzonego obiektu.
  • możesz skopiować/wkleić ten katalog do PowerShell, ponieważ znaczniki ` oznaczają nową linię.
  • obejmują filter-branch, aby również śledzić poprzednio usuwa pliki i inne gałęzie.
  • obejmują git log --format='%aN' | sort -u iterację wszystkich autorów projektu

wyjście

0 -- blame.txt~ -- shaun 
0 -- .blame.txt.un~ -- shaun 
1 -- GitBook-GitTools-06-RewritingHistory.asc -- shaun 
1 -- GitBook-GitTools-05-Searching.asc -- shaun 
1 -- GitBook-GitTools-03-StashingAndCleaning.asc -- shaun 
1 -- GitBook-GitTools-07-ResetDemystified.asc -- shaun 
1 -- README.md -- shaun 
1 -- LICENSE -- shaun 
1 -- GitBook-GitTools-09-Rerere.asc -- shaun 
1 -- GitBook-GitBranching-Rebasing.asc -- shaun 
1 -- blame2.txt -- shaun 
1 -- GitBook-GettingStarted-FirstTimeSetup.asc -- shaun 
1 -- GitBook-GitTools-02-InteractiveStaging.asc -- shaun 
1 -- GitBook-GitTools-01-RevisionSelection.asc -- shaun 
1 -- GitBook-GitInternals-Maintenance.asc -- shaun 
2 -- goals.asc -- shaun 
2 -- GitBook-GitTools-10-Debugging.asc -- shaun 
3 -- blame.txt -- shaun 
6 -- GitBook-GitTools-08-AdvancedMerging.asc -- shaun 
+1

Jak to działa? Chciałbym go ulepszyć, aby uzyskać zatwierdzenia na katalog najwyższego poziomu w repozytorium, lub przynajmniej uzyskać pełną ścieżkę każdego pliku. – Macke

+0

Dodałem dla ciebie długą formę PowerShell. Daj mi znać, jeśli masz dalsze pytania. –

Powiązane problemy