JuJoDi
JuJoDi

Reputation: 14955

Git - list all authors of a folder of files?

How can I list the author names of a particular folder that's versioned by git?

I see that I can git blame a file and list the author of each line, but I can't do that for a folder, and I would also like only a unique list (each author listed only once)

Upvotes: 52

Views: 26250

Answers (3)

ojdo
ojdo

Reputation: 8880

Actually, there is a native Git command for that, git shortlog:

git shortlog -n -s -- myfolder

The options do:

  • Option -s just shows the number of commits per contributor. Without it, the command lists the individual commits per author.
  • Option -n sorts the authors by number of commits (descending order) instead of alphabetical.
Illustrative output example
ojdo@machine:someRepo$ git shortlog -n -s -- myFolder
    37  John Doe
    31  Eager Contributor
    11  Jane Doe
    10  Pipeline Fixer
     5  Docs Specialist

And in case you encounter "duplicate" entries, use a .mailmap file to group multiple entries to the same contributor. This is much saner than trying to rewrite the whole history of a repo, although there is a Q&A for that, too.


What is -- good for?

And just in case you have not encountered a loose -- in a git command yet: it is a separator option to mark that what follows cannot be a <revspec> (range of commits), but only a <pathspec> (file and folder names). That means: if you would omit the -- and by accident had a branch or tag named myfolder, the command git shortlog -n -s myfolder would not filter for the directory myfolder, but instead filter for history of branch or tag "myfolder". This separator is therefore useful (and necessary) in a number of git commands, like log or checkout, whenever you want to be clear whether what you specify is either a revision (commmit, branch, tag) or a path (folder or file name). And of course, this site already has a question on this.

Upvotes: 117

Gustavo do Vale
Gustavo do Vale

Reputation: 31

If you want only the list of authors of a repository:

git ls-files | xargs -n1 git blame --line-porcelain | sed -n 's/^author //p' | sort -d | uniq

If you want to do it for a file order by the number of lines of code contributions it is simple:

git blame --line-porcelain "_MY_FILE_" | sed -n 's/author //p' | sort | uniq -c | sort -rn

If you want to do it for the whole repository also ordered by code contributions:

git ls-files | xargs -n1 git blame --line-porcelain | sed -n 's/^author //p' | sort -f | uniq -ic | sort -nr

Upvotes: 3

rethab
rethab

Reputation: 8403

Based on The shortest possible output from git log containing author and date

do this

git log --pretty=format:"%an%x09" myfolder | sort | uniq

Upvotes: 26

Related Questions