git-commit.sh 14.4 KB
Newer Older
L
Linus Torvalds 已提交
1
#!/bin/sh
2 3
#
# Copyright (c) 2005 Linus Torvalds
4 5
# Copyright (c) 2006 Junio C Hamano

J
Junio C Hamano 已提交
6
USAGE='[-a] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit>) [--amend] [-e] [--author <author>] [[-i | -o] <path>...]'
7
SUBDIRECTORY_OK=Yes
8
. git-sh-setup
9

J
Junio C Hamano 已提交
10 11 12 13 14 15 16 17 18 19 20
git-rev-parse --verify HEAD >/dev/null 2>&1 || initial_commit=t
branch=$(GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD)

case "$0" in
*status)
	status_only=t
	unmerged_ok_if_status=--unmerged ;;
*commit)
	status_only=
	unmerged_ok_if_status= ;;
esac
21 22 23 24 25 26 27

refuse_partial () {
	echo >&2 "$1"
	echo >&2 "You might have meant to say 'git commit -i paths...', perhaps?"
	exit 1
}

J
Junio C Hamano 已提交
28 29 30
THIS_INDEX="$GIT_DIR/index"
NEXT_INDEX="$GIT_DIR/next-index$$"
rm -f "$NEXT_INDEX"
J
Junio C Hamano 已提交
31
save_index () {
J
Junio C Hamano 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
	cp "$THIS_INDEX" "$NEXT_INDEX"
}

report () {
  header="#
# $1:
#   ($2)
#
"
  trailer=""
  while read status name newname
  do
    printf '%s' "$header"
    header=""
    trailer="#
"
    case "$status" in
    M ) echo "#	modified: $name";;
    D*) echo "#	deleted:  $name";;
    T ) echo "#	typechange: $name";;
    C*) echo "#	copied: $name -> $newname";;
    R*) echo "#	renamed: $name -> $newname";;
    A*) echo "#	new file: $name";;
    U ) echo "#	unmerged: $name";;
    esac
  done
  printf '%s' "$trailer"
  [ "$header" ]
J
Junio C Hamano 已提交
60 61 62
}

run_status () {
J
Junio C Hamano 已提交
63 64 65 66
    (
	# We always show status for the whole tree.
	cd "$TOP"

J
Junio C Hamano 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
	IS_INITIAL="$initial_commit"
	REFERENCE=HEAD
	case "$amend" in
	t)
		# If we are amending the initial commit, there
		# is no HEAD^1.
		if git-rev-parse --verify "HEAD^1" >/dev/null 2>&1
		then
			REFERENCE="HEAD^1"
			IS_INITIAL=
		else
			IS_INITIAL=t
		fi
		;;
	esac

J
Junio C Hamano 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
	# If TMP_INDEX is defined, that means we are doing
	# "--only" partial commit, and that index file is used
	# to build the tree for the commit.  Otherwise, if
	# NEXT_INDEX exists, that is the index file used to
	# make the commit.  Otherwise we are using as-is commit
	# so the regular index file is what we use to compare.
	if test '' != "$TMP_INDEX"
	then
	    GIT_INDEX_FILE="$TMP_INDEX"
	    export GIT_INDEX_FILE
	elif test -f "$NEXT_INDEX"
	then
	    GIT_INDEX_FILE="$NEXT_INDEX"
	    export GIT_INDEX_FILE
	fi

	case "$branch" in
	refs/heads/master) ;;
	*)  echo "# On branch $branch" ;;
	esac

J
Junio C Hamano 已提交
104
	if test -z "$IS_INITIAL"
J
Junio C Hamano 已提交
105
	then
106
	    git-diff-index -M --cached --name-status \
J
Junio C Hamano 已提交
107
		--diff-filter=MDTCRA $REFERENCE |
108 109 110 111 112
	    sed -e '
		    s/\\/\\\\/g
		    s/ /\\ /g
	    ' |
	    report "Updated but not checked in" "will commit"
J
Junio C Hamano 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
	    committable="$?"
	else
	    echo '#
# Initial commit
#'
	    git-ls-files |
	    sed -e '
		    s/\\/\\\\/g
		    s/ /\\ /g
		    s/^/A /
	    ' |
	    report "Updated but not checked in" "will commit"

	    committable="$?"
	fi

	git-diff-files  --name-status |
	sed -e '
		s/\\/\\\\/g
		s/ /\\ /g
	' |
	report "Changed but not updated" \
	    "use git-update-index to mark for commit"

	if test -f "$GIT_DIR/info/exclude"
	then
	    git-ls-files -z --others --directory \
		--exclude-from="$GIT_DIR/info/exclude" \
		--exclude-per-directory=.gitignore
	else
	    git-ls-files -z --others --directory \
		--exclude-per-directory=.gitignore
	fi |
	perl -e '$/ = "\0";
	    my $shown = 0;
	    while (<>) {
		chomp;
		s|\\|\\\\|g;
		s|\t|\\t|g;
		s|\n|\\n|g;
		s/^/#	/;
		if (!$shown) {
		    print "#\n# Untracked files:\n";
		    print "#   (use \"git add\" to add to commit)\n";
		    print "#\n";
		    $shown = 1;
		}
		print "$_\n";
	    }
	'
163 164 165

	if test -n "$verbose"
	then
J
Junio C Hamano 已提交
166
	    git-diff-index --cached -M -p --diff-filter=MDTCRA $REFERENCE
167
	fi
J
Junio C Hamano 已提交
168 169 170 171 172 173 174
	case "$committable" in
	0)
	    echo "nothing to commit"
	    exit 1
	esac
	exit 0
    )
J
Junio C Hamano 已提交
175 176
}

J
Junio C Hamano 已提交
177 178 179 180 181 182 183 184 185 186
trap '
	test -z "$TMP_INDEX" || {
		test -f "$TMP_INDEX" && rm -f "$TMP_INDEX"
	}
	rm -f "$NEXT_INDEX"
' 0

################################################################
# Command line argument parsing and sanity checking

187 188
all=
also=
J
Junio C Hamano 已提交
189
only=
190 191
logfile=
use_commit=
J
Junio C Hamano 已提交
192
amend=
193 194 195 196
no_edit=
log_given=
log_message=
verify=t
J
Junio C Hamano 已提交
197
verbose=
198 199
signoff=
force_author=
200
only_include_assumed=
201
while case "$#" in 0) break;; esac
202
do
203
  case "$1" in
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
  -F|--F|-f|--f|--fi|--fil|--file)
      case "$#" in 1) usage ;; esac
      shift
      no_edit=t
      log_given=t$log_given
      logfile="$1"
      shift
      ;;
  -F*|-f*)
      no_edit=t
      log_given=t$log_given
      logfile=`expr "$1" : '-[Ff]\(.*\)'`
      shift
      ;;
  --F=*|--f=*|--fi=*|--fil=*|--file=*)
      no_edit=t
      log_given=t$log_given
      logfile=`expr "$1" : '-[^=]*=\(.*\)'`
      shift
      ;;
224
  -a|--a|--al|--all)
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
      all=t
      shift
      ;;
  --au=*|--aut=*|--auth=*|--autho=*|--author=*)
      force_author=`expr "$1" : '-[^=]*=\(.*\)'`
      shift
      ;;
  --au|--aut|--auth|--autho|--author)
      case "$#" in 1) usage ;; esac
      shift
      force_author="$1"
      shift
      ;;
  -e|--e|--ed|--edi|--edit)
      no_edit=
      shift
      ;;
  -i|--i|--in|--inc|--incl|--inclu|--includ|--include)
      also=t
      shift
      ;;
J
Junio C Hamano 已提交
246 247 248 249
  -o|--o|--on|--onl|--only)
      only=t
      shift
      ;;
250
  -m|--m|--me|--mes|--mess|--messa|--messag|--message)
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
      case "$#" in 1) usage ;; esac
      shift
      log_given=t$log_given
      log_message="$1"
      no_edit=t
      shift
      ;;
  -m*)
      log_given=t$log_given
      log_message=`expr "$1" : '-m\(.*\)'`
      no_edit=t
      shift
      ;;
  --m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
      log_given=t$log_given
      log_message=`expr "$1" : '-[^=]*=\(.*\)'`
      no_edit=t
      shift
      ;;
  -n|--n|--no|--no-|--no-v|--no-ve|--no-ver|--no-veri|--no-verif|--no-verify)
      verify=
      shift
      ;;
J
Junio C Hamano 已提交
274 275 276 277 278 279
  --a|--am|--ame|--amen|--amend)
      amend=t
      log_given=t$log_given
      use_commit=HEAD
      shift
      ;;
280 281 282 283 284 285 286 287 288
  -c)
      case "$#" in 1) usage ;; esac
      shift
      log_given=t$log_given
      use_commit="$1"
      no_edit=
      shift
      ;;
  --ree=*|--reed=*|--reedi=*|--reedit=*|--reedit-=*|--reedit-m=*|\
289 290
  --reedit-me=*|--reedit-mes=*|--reedit-mess=*|--reedit-messa=*|\
  --reedit-messag=*|--reedit-message=*)
291 292 293 294 295 296
      log_given=t$log_given
      use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
      no_edit=
      shift
      ;;
  --ree|--reed|--reedi|--reedit|--reedit-|--reedit-m|--reedit-me|\
297
  --reedit-mes|--reedit-mess|--reedit-messa|--reedit-messag|--reedit-message)
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
      case "$#" in 1) usage ;; esac
      shift
      log_given=t$log_given
      use_commit="$1"
      no_edit=
      shift
      ;;
  -C)
      case "$#" in 1) usage ;; esac
      shift
      log_given=t$log_given
      use_commit="$1"
      no_edit=t
      shift
      ;;
  --reu=*|--reus=*|--reuse=*|--reuse-=*|--reuse-m=*|--reuse-me=*|\
314 315
  --reuse-mes=*|--reuse-mess=*|--reuse-messa=*|--reuse-messag=*|\
  --reuse-message=*)
316 317 318 319 320 321
      log_given=t$log_given
      use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
      no_edit=t
      shift
      ;;
  --reu|--reus|--reuse|--reuse-|--reuse-m|--reuse-me|--reuse-mes|\
322
  --reuse-mess|--reuse-messa|--reuse-messag|--reuse-message)
323 324 325 326 327 328 329
      case "$#" in 1) usage ;; esac
      shift
      log_given=t$log_given
      use_commit="$1"
      no_edit=t
      shift
      ;;
330
  -s|--s|--si|--sig|--sign|--signo|--signof|--signoff)
331 332 333
      signoff=t
      shift
      ;;
J
Junio C Hamano 已提交
334 335 336
  -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
      verbose=t
      shift
337
      ;;
338
  --)
339 340 341
      shift
      break
      ;;
342
  -*)
343 344
      usage
      ;;
345
  *)
346 347
      break
      ;;
348
  esac
349 350
done

J
Junio C Hamano 已提交
351 352 353
################################################################
# Sanity check options

J
Junio C Hamano 已提交
354 355 356 357 358 359 360 361 362
case "$amend,$initial_commit" in
t,t)
  die "You do not have anything to amend." ;;
t,)
  if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
    die "You are in the middle of a merge -- cannot amend."
  fi ;;
esac

363 364 365 366 367
case "$log_given" in
tt*)
  die "Only one of -c/-C/-F/-m can be used." ;;
esac

J
Junio C Hamano 已提交
368 369 370 371 372 373 374 375
case "$#,$also$only" in
*,tt)
  die "Only one of --include/--only can be used." ;;
0,t)
  die "No paths with --include/--only does not make sense." ;;
0,)
  ;;
*,)
J
Junio C Hamano 已提交
376
  only_include_assumed="# Explicit paths specified without -i nor -o; assuming --only paths..."
377
  also=
J
Junio C Hamano 已提交
378 379 380
  ;;
esac
unset only
J
Junio C Hamano 已提交
381 382 383 384 385 386 387 388 389 390 391
case "$all,$also,$#" in
t,t,*)
	die "Cannot use -a and -i at the same time." ;;
t,,[1-9]*)
	die "Paths with -a does not make sense." ;;
,t,0)
	die "No paths with -i does not make sense." ;;
esac

################################################################
# Prepare index to have a tree to be committed
J
Junio C Hamano 已提交
392

393
TOP=`git-rev-parse --show-cdup`
J
Junio C Hamano 已提交
394 395 396 397
if test -z "$TOP"
then
	TOP=./
fi
398 399 400

case "$all,$also" in
t,)
J
Junio C Hamano 已提交
401
	save_index &&
402
	(
J
Junio C Hamano 已提交
403
		cd "$TOP"
J
Junio C Hamano 已提交
404 405
		GIT_INDEX_FILE="$NEXT_INDEX"
		export GIT_INDEX_FILE
406 407 408
		git-diff-files --name-only -z |
		git-update-index --remove -z --stdin
	)
J
Junio C Hamano 已提交
409
	;;
410
,t)
J
Junio C Hamano 已提交
411
	save_index &&
412 413
	git-ls-files --error-unmatch -- "$@" >/dev/null || exit

414
	git-diff-files --name-only -z -- "$@"  |
J
Junio C Hamano 已提交
415 416 417 418 419 420
	(
		cd "$TOP"
		GIT_INDEX_FILE="$NEXT_INDEX"
		export GIT_INDEX_FILE
		git-update-index --remove -z --stdin
	)
421
	;;
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
,)
	case "$#" in
	0)
	    ;; # commit as-is
	*)
	    if test -f "$GIT_DIR/MERGE_HEAD"
	    then
		refuse_partial "Cannot do a partial commit during a merge."
	    fi
	    TMP_INDEX="$GIT_DIR/tmp-index$$"
	    if test -z "$initial_commit"
	    then
		# make sure index is clean at the specified paths, or
		# they are additions.
		dirty_in_index=`git-diff-index --cached --name-status \
J
Junio C Hamano 已提交
437
			--diff-filter=DMTU HEAD -- "$@"`
438
		test -z "$dirty_in_index" ||
J
Junio C Hamano 已提交
439
		refuse_partial "Different in index and the last commit:
440 441
$dirty_in_index"
	    fi
442
	    commit_only=`git-ls-files --error-unmatch -- "$@"` || exit
J
Junio C Hamano 已提交
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465

	    # Build the temporary index and update the real index
	    # the same way.
	    if test -z "$initial_commit"
	    then
		cp "$THIS_INDEX" "$TMP_INDEX"
		GIT_INDEX_FILE="$TMP_INDEX" git-read-tree -m HEAD
	    else
		    rm -f "$TMP_INDEX"
	    fi || exit

	    echo "$commit_only" |
	    GIT_INDEX_FILE="$TMP_INDEX" \
	    git-update-index --add --remove --stdin &&

	    save_index &&
	    echo "$commit_only" |
	    (
		GIT_INDEX_FILE="$NEXT_INDEX"
		export GIT_INDEX_FILE
		git-update-index --remove --stdin
	    ) || exit
	    ;;
466 467 468 469
	esac
	;;
esac

J
Junio C Hamano 已提交
470 471 472 473
################################################################
# If we do as-is commit, the index file will be THIS_INDEX,
# otherwise NEXT_INDEX after we make this commit.  We leave
# the index as is if we abort.
474

J
Junio C Hamano 已提交
475
if test -f "$NEXT_INDEX"
476
then
J
Junio C Hamano 已提交
477 478 479
	USE_INDEX="$NEXT_INDEX"
else
	USE_INDEX="$THIS_INDEX"
480 481
fi

J
Junio C Hamano 已提交
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
GIT_INDEX_FILE="$USE_INDEX" \
    git-update-index -q $unmerged_ok_if_status --refresh || exit

################################################################
# If the request is status, just show it and exit.

case "$0" in
*status)
	run_status
	exit $?
esac

################################################################
# Grab commit message, write out tree and make commit.

497 498 499 500 501 502
if test t = "$verify" && test -x "$GIT_DIR"/hooks/pre-commit
then
	if test "$TMP_INDEX"
	then
		GIT_INDEX_FILE="$TMP_INDEX" "$GIT_DIR"/hooks/pre-commit
	else
J
Junio C Hamano 已提交
503
		GIT_INDEX_FILE="$USE_INDEX" "$GIT_DIR"/hooks/pre-commit
504 505
	fi || exit
fi
506

507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
if test "$log_message" != ''
then
	echo "$log_message"
elif test "$logfile" != ""
then
	if test "$logfile" = -
	then
		test -t 0 &&
		echo >&2 "(reading log message from standard input)"
		cat
	else
		cat <"$logfile"
	fi
elif test "$use_commit" != ""
then
	git-cat-file commit "$use_commit" | sed -e '1,/^$/d'
523 524 525
elif test -f "$GIT_DIR/MERGE_HEAD" && test -f "$GIT_DIR/MERGE_MSG"
then
	cat "$GIT_DIR/MERGE_MSG"
526
fi | git-stripspace >"$GIT_DIR"/COMMIT_EDITMSG
527 528 529

case "$signoff" in
t)
530 531 532 533 534 535
	{
		echo
		git-var GIT_COMMITTER_IDENT | sed -e '
			s/>.*/>/
			s/^/Signed-off-by: /
		'
536
	} >>"$GIT_DIR"/COMMIT_EDITMSG
537 538 539 540 541
	;;
esac

if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
	echo "#"
A
Alex Riesen 已提交
542
	echo "# It looks like you may be committing a MERGE."
543 544 545 546
	echo "# If this is not correct, please remove the file"
	echo "#	$GIT_DIR/MERGE_HEAD"
	echo "# and try again"
	echo "#"
547
fi >>"$GIT_DIR"/COMMIT_EDITMSG
548

549
# Author
J
Junio C Hamano 已提交
550 551 552 553 554 555 556 557 558
if test '' != "$force_author"
then
	GIT_AUTHOR_NAME=`expr "$force_author" : '\(.*[^ ]\) *<.*'` &&
	GIT_AUTHOR_EMAIL=`expr "$force_author" : '.*\(<.*\)'` &&
	test '' != "$GIT_AUTHOR_NAME" &&
	test '' != "$GIT_AUTHOR_EMAIL" ||
	die "malformatted --author parameter"
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
elif test '' != "$use_commit"
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
then
	pick_author_script='
	/^author /{
		s/'\''/'\''\\'\'\''/g
		h
		s/^author \([^<]*\) <[^>]*> .*$/\1/
		s/'\''/'\''\'\'\''/g
		s/.*/GIT_AUTHOR_NAME='\''&'\''/p

		g
		s/^author [^<]* <\([^>]*\)> .*$/\1/
		s/'\''/'\''\'\'\''/g
		s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p

		g
		s/^author [^<]* <[^>]*> \(.*\)$/\1/
		s/'\''/'\''\'\'\''/g
		s/.*/GIT_AUTHOR_DATE='\''&'\''/p

		q
	}
	'
	set_author_env=`git-cat-file commit "$use_commit" |
	LANG=C LC_ALL=C sed -ne "$pick_author_script"`
	eval "$set_author_env"
	export GIT_AUTHOR_NAME
	export GIT_AUTHOR_EMAIL
	export GIT_AUTHOR_DATE
fi

589
PARENTS="-p HEAD"
590
if test -z "$initial_commit"
J
Junio C Hamano 已提交
591
then
592
	if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
J
Junio C Hamano 已提交
593
		PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
J
Junio C Hamano 已提交
594 595 596
	elif test -n "$amend"; then
		PARENTS=$(git-cat-file commit HEAD |
			sed -n -e '/^$/q' -e 's/^parent /-p /p')
597
	fi
J
Junio C Hamano 已提交
598 599
else
	if [ -z "$(git-ls-files)" ]; then
J
Junio C Hamano 已提交
600
		echo >&2 Nothing to commit
J
Junio C Hamano 已提交
601 602 603
		exit 1
	fi
	PARENTS=""
604
fi
605

606 607 608 609
{
	test -z "$only_include_assumed" || echo "$only_include_assumed"
	run_status
} >>"$GIT_DIR"/COMMIT_EDITMSG
S
Santi_Béjar 已提交
610
if [ "$?" != "0" -a ! -f "$GIT_DIR/MERGE_HEAD" ]
L
Linus Torvalds 已提交
611
then
612
	rm -f "$GIT_DIR/COMMIT_EDITMSG"
J
Junio C Hamano 已提交
613
	run_status
L
Linus Torvalds 已提交
614 615
	exit 1
fi
616
case "$no_edit" in
617
'')
618 619 620 621 622 623
	case "${VISUAL:-$EDITOR},$TERM" in
	,dumb)
		echo >&2 "Terminal is dumb but no VISUAL nor EDITOR defined."
		echo >&2 "Please supply the commit log message using either"
		echo >&2 "-m or -F option.  A boilerplate log message has"
		echo >&2 "been prepared in $GIT_DIR/COMMIT_EDITMSG"
624 625
		exit 1
		;;
626
	esac
627
	${VISUAL:-${EDITOR:-vi}} "$GIT_DIR/COMMIT_EDITMSG"
628 629
	;;
esac
630 631 632 633 634

case "$verify" in
t)
	if test -x "$GIT_DIR"/hooks/commit-msg
	then
635
		"$GIT_DIR"/hooks/commit-msg "$GIT_DIR"/COMMIT_EDITMSG || exit
636 637 638
	fi
esac

J
Junio C Hamano 已提交
639
sed -e '
640 641 642 643 644
    /^diff --git a\/.*/{
	s///
	q
    }
    /^#/d
J
Junio C Hamano 已提交
645 646
' "$GIT_DIR"/COMMIT_EDITMSG |
git-stripspace >"$GIT_DIR"/COMMIT_MSG
647 648 649 650 651

if cnt=`grep -v -i '^Signed-off-by' "$GIT_DIR"/COMMIT_MSG |
	git-stripspace |
	wc -l` &&
   test 0 -lt $cnt
652
then
653 654
	if test -z "$TMP_INDEX"
	then
J
Junio C Hamano 已提交
655
		tree=$(GIT_INDEX_FILE="$USE_INDEX" git-write-tree)
656 657 658 659
	else
		tree=$(GIT_INDEX_FILE="$TMP_INDEX" git-write-tree) &&
		rm -f "$TMP_INDEX"
	fi &&
660
	commit=$(cat "$GIT_DIR"/COMMIT_MSG | git-commit-tree $tree $PARENTS) &&
J
Junio C Hamano 已提交
661
	git-update-ref HEAD $commit $current &&
J
Junio C Hamano 已提交
662 663 664 665 666 667 668
	rm -f -- "$GIT_DIR/MERGE_HEAD" &&
	if test -f "$NEXT_INDEX"
	then
		mv "$NEXT_INDEX" "$THIS_INDEX"
	else
		: ;# happy
	fi
669 670 671 672
else
	echo >&2 "* no commit message?  aborting commit."
	false
fi
673
ret="$?"
674
rm -f "$GIT_DIR/COMMIT_MSG" "$GIT_DIR/COMMIT_EDITMSG"
675 676 677 678
if test -d "$GIT_DIR/rr-cache"
then
	git-rerere
fi
679 680 681 682 683

if test -x "$GIT_DIR"/hooks/post-commit && test "$ret" = 0
then
	"$GIT_DIR"/hooks/post-commit
fi
684
exit "$ret"