views:

65

answers:

1

Could someone help explain what is going on in this precommit hook? I thought changing files would cause them to be restaged.

http://snipplr.com/view/28523/git-precommit-hook-to-fix-trailing-whitespace/

+1  A: 

The key is to commit the right content, that is:

  • only what has been stages (and added to the index)
  • plus some modifications introduced by the pre-commit hook

The first point is achieved through the git diff-index

Compares the content and mode of the blobs found via a tree object with the content of the current index and, optionally ignoring the stat state of the file on disk.

exec git diff-index --check --cached $against --

with the option --cached:

do not consider the on-disk file at all

Any modification is then taken into account to be part of the new commit.

You can look at the source of commit.c:

static int prepare_to_commit(const char *index_file, const char *prefix,
                 struct wt_status *s)
{
...

    if (!no_verify && run_hook(index_file, "pre-commit", NULL))
        return 0;
...


/*
 * Re-read the index as pre-commit hook could have updated it,
 * and write it out as a tree.  We must do this before we invoke
 * the editor and after we invoke run_status above.
 */
discard_cache();
read_cache_from(index_file);
VonC