Re: Correctly detecting modified paths in merge commits?
- From
Jakub Narebski <jnareb@gmail.com>
- Date
- Dec 16, 2010, 18:33 UTC
- Message-ID
- <m37hgdm84r.fsf@localhost.localdomain>
- In-Reply-To
- <AANLkTimsHZ543B7XWS6taa0w2Vc4huznx3UMs4Ejg3af@mail.gmail.com>
Dun Peal <dunpealer@gmail.com> writes:
Show 8 quoted lines
> We wrote a post-receive hook that alerts users (via email) when > specific paths are modified by their peers. The implementation is > pretty simple: whenever a new commit is made, we ask git for the full > list of files modified by that commit: > > git diff --name-only <COMMIT HASH>^! > > This works well for regular commits, but breaks for merge commits.
Note that <commit>^! is *range* specifier, and 'git diff' really takes two *endpoints*.
>From git-diff(1) manpage.
For a more complete list of ways to spell <commit>, see "SPECIFYING
REVISIONS" section in gitrevisions(1). However, "diff" is about
comparing two _endpoints_, not ranges, and the range notations
("<commit>..<commit>" and "<commit>...<commit>") do not mean a
range as defined in the "SPECIFYING RANGES" section in gitrevisions(1).<commit>^1 means include given commit but exclude all of its parents (see gitrevisions(7)).
For a merge commit r1^! means r1 ^p1 ^p2 (where p1 and p2 are parents of r1), which for git-diff probably means "git diff p1 r1".
Show 11 quoted lines
> For example, suppose we have the following basic merge scenario: > > B > / \ > A D > \ / > C > > Root A was branched to B and C, then merged into commit D. > > Problem is, the diff for D^! will include all the changes introduced by C.
See above.
Try
$ git diff-tree --name-only -c <COMMIT HADH>
instead. '-c' is to show merge commit as combined diff (noting changes different from both parents). I'm not sure if this is what you want.
There is alwats '--cc' or '-m' instead of '-c'.
-- Jakub Narebski Poland ShadeHawk on #git