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

J
Junio C Hamano 已提交
6
. git-sh-setup || die "Not a git archive"
7

8
usage () {
9
	die 'git commit [-a] [-v | --no-verify]  [-m <message>] [-F <logfile>] [(-C|-c) <commit>] [<path>...]'
10 11
}

12
all= logfile= use_commit= no_edit= log_given= log_message= verify=t signoff=
13
while case "$#" in 0) break;; esac
14
do
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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 60 61 62 63 64 65 66
  case "$1" in
  -a|--a|--al|--all)
    all=t
    shift ;;
  -F=*|--f=*|--fi=*|--fil=*|--file=*)
    log_given=t$log_given
    logfile=`expr "$1" : '-[^=]*=\(.*\)'`
    no_edit=t
    shift ;;
  -F|--f|--fi|--fil|--file)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    logfile="$1"
    no_edit=t
    shift ;;
  -m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
    log_given=t$log_given
    log_message=`expr "$1" : '-[^=]*=\(.*\)'`
    no_edit=t
    shift ;;
  -m|--m|--me|--mes|--mess|--messa|--messag|--message)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    log_message="$1"
    no_edit=t
    shift ;;
  -c=*|--ree=*|--reed=*|--reedi=*|--reedit=*|--reedit-=*|--reedit-m=*|\
  --reedit-me=*|--reedit-mes=*|--reedit-mess=*|--reedit-messa=*|\
  --reedit-messag=*|--reedit-message=*)
    log_given=t$log_given
    use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
    shift ;;
  -c|--ree|--reed|--reedi|--reedit|--reedit-|--reedit-m|--reedit-me|\
  --reedit-mes|--reedit-mess|--reedit-messa|--reedit-messag|--reedit-message)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    use_commit="$1"
    shift ;;
  -C=*|--reu=*|--reus=*|--reuse=*|--reuse-=*|--reuse-m=*|--reuse-me=*|\
  --reuse-mes=*|--reuse-mess=*|--reuse-messa=*|--reuse-messag=*|\
  --reuse-message=*)
    log_given=t$log_given
    use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
    no_edit=t
    shift ;;
  -C|--reu|--reus|--reuse|--reuse-|--reuse-m|--reuse-me|--reuse-mes|\
  --reuse-mess|--reuse-messa|--reuse-messag|--reuse-message)
    case "$#" in 1) usage ;; esac; shift
    log_given=t$log_given
    use_commit="$1"
    no_edit=t
    shift ;;
67 68 69
  -e|--e|--ed|--edi|--edit)
    no_edit=
    shift ;;
70 71 72
  -s|--s|--si|--sig|--sign|--signo|--signof|--signoff)
    signoff=t
    shift ;;
73 74 75
  -n|--n|--no|--no-|--no-v|--no-ve|--no-ver|--no-veri|--no-verif|--no-verify)
    verify=
    shift ;;
76 77 78
  -v|--v|--ve|--ver|--veri|--verif|--verify)
    verify=t
    shift ;;
79
  --)
80
    shift
81 82 83 84 85 86
    break ;;
  -*)
     usage ;;
  *)
    break ;;
  esac
87 88
done

89 90 91 92 93
case "$log_given" in
tt*)
  die "Only one of -c/-C/-F/-m can be used." ;;
esac

J
Junio C Hamano 已提交
94 95
case "$all,$#" in
t,*)
96
	git-diff-files --name-only -z |
97
	git-update-index --remove -z --stdin
98
	;;
J
Junio C Hamano 已提交
99 100
,0)
	;;
101 102
*)
	git-diff-files --name-only -z "$@" |
103
	git-update-index --remove -z --stdin
104 105
	;;
esac || exit 1
J
Junio C Hamano 已提交
106
git-update-index -q --refresh || exit 1
107

108 109
case "$verify" in
t)
110 111 112 113
	if test -x "$GIT_DIR"/hooks/pre-commit
	then
		"$GIT_DIR"/hooks/pre-commit || exit
	fi
114 115
esac

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
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'
132 133 134 135 136 137 138 139 140 141 142 143
fi | git-stripspace >.editmsg

case "$signoff" in
t)
	git-var GIT_COMMITTER_IDENT | sed -e '
		s/>.*/>/
		s/^/Signed-off-by: /
	' >>.editmsg
	;;
esac

if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
144 145 146

	test -f "$GIT_DIR/MERGE_MSG" && cat "$GIT_DIR/MERGE_MSG"

147 148 149 150 151 152 153
	echo "#"
	echo "# It looks like your may be committing a MERGE."
	echo "# If this is not correct, please remove the file"
	echo "#	$GIT_DIR/MERGE_HEAD"
	echo "# and try again"
	echo "#"
fi >>.editmsg
154

155
PARENTS="-p HEAD"
156
if [ ! -r "$GIT_DIR/HEAD" ]; then
157 158 159 160 161 162
	if [ -z "$(git-ls-files)" ]; then
		echo Nothing to commit 1>&2
		exit 1
	fi
	PARENTS=""
else
163
	if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
J
Junio C Hamano 已提交
164
		PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
165 166
	fi
	if test "$use_commit" != ""
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
	then
		pick_author_script='
		/^author /{
			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" |
		sed -ne "$pick_author_script"`
		eval "$set_author_env"
		export GIT_AUTHOR_NAME
		export GIT_AUTHOR_EMAIL
		export GIT_AUTHOR_DATE
194
	fi
195
fi
J
Junio C Hamano 已提交
196
git-status >>.editmsg
197
if [ "$?" != "0" -a ! -f $GIT_DIR/MERGE_HEAD ]
L
Linus Torvalds 已提交
198
then
199
	rm -f .editmsg
J
Junio C Hamano 已提交
200
	git-status
L
Linus Torvalds 已提交
201 202
	exit 1
fi
203
case "$no_edit" in
204 205 206 207
'')
	${VISUAL:-${EDITOR:-vi}} .editmsg
	;;
esac
208 209 210 211 212 213 214 215 216

case "$verify" in
t)
	if test -x "$GIT_DIR"/hooks/commit-msg
	then
		"$GIT_DIR"/hooks/commit-msg .editmsg || exit
	fi
esac

L
Linus Torvalds 已提交
217
grep -v '^#' < .editmsg | git-stripspace > .cmitmsg
218 219
grep -v -i '^Signed-off-by' .cmitmsg >.cmitchk
if test -s .cmitchk
220
then
221 222
	tree=$(git-write-tree) &&
	commit=$(cat .cmitmsg | git-commit-tree $tree $PARENTS) &&
223 224
	echo $commit > "$GIT_DIR/HEAD" &&
	rm -f -- "$GIT_DIR/MERGE_HEAD"
225 226 227 228
else
	echo >&2 "* no commit message?  aborting commit."
	false
fi
229
ret="$?"
230
rm -f .cmitmsg .editmsg .cmitchk
231 232 233 234 235

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