From: Jakub Narebski Date: Thu, 16 Dec 2010 18:33:38 GMT Subject: Re: Correctly detecting modified paths in merge commits? Message-ID: In-Reply-To: Dun Peal writes: > 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 ^! > > This works well for regular commits, but breaks for merge commits. Note that ^! is *range* specifier, and 'git diff' really takes two *endpoints*. >From git-diff(1) manpage. For a more complete list of ways to spell , see "SPECIFYING REVISIONS" section in gitrevisions(1). However, "diff" is about comparing two _endpoints_, not ranges, and the range notations (".." and "...") do not mean a range as defined in the "SPECIFYING RANGES" section in gitrevisions(1). ^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". > 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 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