On Thu, Jul 4, 2013 at 2:19 PM, John Keeping <john@xxxxxxxxxxxxx> wrote: > On Thu, Jul 04, 2013 at 01:59:10PM +0300, Orgad Shaneh wrote: >> On Thu, Jul 4, 2013 at 1:34 PM, John Keeping <john@xxxxxxxxxxxxx> wrote: >> > On Thu, Jul 04, 2013 at 12:47:28PM +0300, Orgad Shaneh wrote: >> >> Hi, >> >> >> >> If a prepare-commit-msg hook is used, git gui executes it for "New Commit". >> >> >> >> If the "New Commit" is selected, and then immediately "Amend" (before >> >> the hook returns), when the hook returns the message is replaced with >> >> the one produced by the hook. >> > >> > I think this is a problem with the hook you are running. The hook is >> > given arguments specifying the message file and optionally the source of >> > whatever is already in the file (see githooks(5) for details). >> > >> > It sounds like your hook is blindly overwriting the file, rather than >> > preserving its contents in the cases where you wish to do so. >> >> Let me try to explain. >> >> When git gui is executed, it calls the prepare-commit-msg script with >> .git/PREPARE_COMMIT_MSG as an argument. >> >> When amend is selected, the hook is *not* called at all (what would it >> prepare? The message is already committed) >> >> Use the following hook to reproduce: >> --- snip --- >> #!/bin/sh >> >> sleep 5 >> echo "$@" >> /tmp/hook.log >> echo 'Hello hook' > "$1" >> --- snip --- >> >> Now run git gui (or press F5 if it is already running), and before 5 >> seconds pass, click Amend last commit. You'll see the commit's >> message, but when the 5 seconds pass it is replaced with "Hello hook". >> That's the bug. > > Yes, and that's a bug in the hook. The hook is called with a second > argument "commit" but it is ignoring this and blindly overwriting the > message. githooks(5) says: > > prepare-commit-msg > This hook is invoked by git commit right after preparing the default > log message, and before the editor is started. > > It takes one to three parameters. The first is the name of the > file that contains the commit log message. The second is the > source of the commit message, and can be: message (if a -m or -F > option was given); template (if a -t option was given or the > configuration option commit.template is set); merge (if the > commit is a merge or a .git/MERGE_MSG file exists); squash (if a > .git/SQUASH_MSG file exists); or commit, followed by a commit > SHA1 (if a -c, -C or --amend option was given). > > If the exit status is non-zero, git commit will abort. > > The purpose of the hook is to edit the message file in place, > and it is not suppressed by the --no-verify option. A non-zero > exit means a failure of the hook and aborts the commit. It > should not be used as replacement for pre-commit hook. > > Your problem is that your hook script is not checking $2 so it is > overwriting the message even when you do not want to do so. No, it isn't. Not by git-gui at least. Check /tmp/hook.log with the hook I provided... - Orgad -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html