git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Effectively tracing project contributions with git

From
Theodore Tso <tytso@mit.edu>
Date
Sep 13, 2009, 02:28 UTC
Message-ID
<20090913022843.GB26588@mit.edu>
In-Reply-To
<4AAC3889.6030908@webdrake.net>
On Sun, Sep 13, 2009 at 02:10:49AM +0200, Joseph Wakeling wrote:
Show 6 quoted lines
> 
> I don't see any solution that doesn't see me browsing diffs -- there's
> no metric that will solve the problem -- but if your stats work could
> help me get an output of the form 'here are all the diffs on file X by
> contributor Y in order of size, largest first' then I think it would
> help a LOT.
This will display all of the diffs on file (pathname) XXX by contributor YYY:
	git log -p --author=YYY XXX 
You might also find the diffstats useful:
	git log --stat --author=YYY XXX
Or if you want *only* the diffstats for the file in question, you might try:
	git log --stat --pretty=format: --author=YYY XXX | grep XXX

So the bottom line is git will allow you to extract quite a lot of information. You might need to do some perl- or shell- or python- scripting to analyze or format the information, but the harder question is determining exactly what question you want to ask.

Eliminating whitespace changes isn't hard (add the -b flag). If you want to eliminate variable renaming, that's harder since that requires actually parsing the patch. There are programs that will do that (normally used by University professors to catch students cheating at Programming 101 courses :-), but you'd need to do some shell (or perl or python) scripting to splice them into the git invocations to extract out the information.

Is there a particular reason why this is important to you? Is it for curiosity reasons; are you trying to build a case that you've contacted all of the significant contributors for the purposes of changing the license used on a file? If it's the latter, what I'd probably do is just simply collect everyone who has ever changed a file (git log --format="%aN <%aE>" pathname/to/a/file | sort -u) and try to get as many people as possible to agree to the license change. For the ones who have _not_ agreed, or which you can not contact, you can go back and just analyze their changes (git log --author=YYY) to decide whether or not they are significant, and whether you need to try extract hard to contact them, or in the worst case, find someone to rewrite the parts of the file which they had modified in the past.

Or maybe you have some other reason for gathering said information. Depending on what the high-level thing it is that you are trying to do, there may be an easier or more elegant way to get the information you are requesting.

						- Ted
Previous: Joseph WakelingNext: Jeff King
Message 5 of 8 in “Effectively tracing project contributions with git”
  1. Joseph WakelingSep 12, 2009
  2. Jeff KingSep 12, 2009
  3. Sverre RabbelierSep 12, 2009
  4. Joseph WakelingSep 13, 2009
  5. Theodore TsoSep 13, 2009
  6. Jeff KingSep 13, 2009
  7. Joseph WakelingSep 13, 2009
  8. Joseph WakelingSep 13, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.