am: learn passing -b to mailinfo
[git/gitweb.git] / git-am.sh
blob8b755d93ba53e133e1bb4114b0736b5dd6f93793
1 #!/bin/sh
3 # Copyright (c) 2005, 2006 Junio C Hamano
5 SUBDIRECTORY_OK=Yes
6 OPTIONS_KEEPDASHDASH=
7 OPTIONS_SPEC="\
8 git am [options] [(<mbox>|<Maildir>)...]
9 git am [options] (--resolved | --skip | --abort)
11 i,interactive run interactively
12 b,binary* (historical option -- no-op)
13 3,3way allow fall back on 3way merging if needed
14 q,quiet be quiet
15 s,signoff add a Signed-off-by line to the commit message
16 u,utf8 recode into utf8 (default)
17 k,keep pass -k flag to git-mailinfo
18 keep-non-patch pass -b flag to git-mailinfo
19 keep-cr pass --keep-cr flag to git-mailsplit for mbox format
20 no-keep-cr do not pass --keep-cr flag to git-mailsplit independent of am.keepcr
21 c,scissors strip everything before a scissors line
22 whitespace= pass it through git-apply
23 ignore-space-change pass it through git-apply
24 ignore-whitespace pass it through git-apply
25 directory= pass it through git-apply
26 C= pass it through git-apply
27 p= pass it through git-apply
28 patch-format= format the patch(es) are in
29 reject pass it through git-apply
30 resolvemsg= override error message when patch failure occurs
31 continue continue applying patches after resolving a conflict
32 r,resolved synonyms for --continue
33 skip skip the current patch
34 abort restore the original branch and abort the patching operation.
35 committer-date-is-author-date lie about committer date
36 ignore-date use current timestamp for author date
37 rerere-autoupdate update the index with reused conflict resolution if possible
38 rebasing* (internal use for git-rebase)"
40 . git-sh-setup
41 prefix=$(git rev-parse --show-prefix)
42 set_reflog_action am
43 require_work_tree
44 cd_to_toplevel
46 git var GIT_COMMITTER_IDENT >/dev/null ||
47 die "You need to set your committer info first"
49 if git rev-parse --verify -q HEAD >/dev/null
50 then
51 HAS_HEAD=yes
52 else
53 HAS_HEAD=
56 cmdline="git am"
57 if test '' != "$interactive"
58 then
59 cmdline="$cmdline -i"
61 if test '' != "$threeway"
62 then
63 cmdline="$cmdline -3"
66 sq () {
67 git rev-parse --sq-quote "$@"
70 stop_here () {
71 echo "$1" >"$dotest/next"
72 git rev-parse --verify -q HEAD >"$dotest/abort-safety"
73 exit 1
76 safe_to_abort () {
77 if test -f "$dotest/dirtyindex"
78 then
79 return 1
82 if ! test -s "$dotest/abort-safety"
83 then
84 return 0
87 abort_safety=$(cat "$dotest/abort-safety")
88 if test "z$(git rev-parse --verify -q HEAD)" = "z$abort_safety"
89 then
90 return 0
92 echo >&2 "You seem to have moved HEAD since the last 'am' failure."
93 echo >&2 "Not rewinding to ORIG_HEAD"
94 return 1
97 stop_here_user_resolve () {
98 if [ -n "$resolvemsg" ]; then
99 printf '%s\n' "$resolvemsg"
100 stop_here $1
102 echo "When you have resolved this problem run \"$cmdline --resolved\"."
103 echo "If you would prefer to skip this patch, instead run \"$cmdline --skip\"."
104 echo "To restore the original branch and stop patching run \"$cmdline --abort\"."
106 stop_here $1
109 go_next () {
110 rm -f "$dotest/$msgnum" "$dotest/msg" "$dotest/msg-clean" \
111 "$dotest/patch" "$dotest/info"
112 echo "$next" >"$dotest/next"
113 this=$next
116 cannot_fallback () {
117 echo "$1"
118 echo "Cannot fall back to three-way merge."
119 exit 1
122 fall_back_3way () {
123 O_OBJECT=`cd "$GIT_OBJECT_DIRECTORY" && pwd`
125 rm -fr "$dotest"/patch-merge-*
126 mkdir "$dotest/patch-merge-tmp-dir"
128 # First see if the patch records the index info that we can use.
129 git apply --build-fake-ancestor "$dotest/patch-merge-tmp-index" \
130 "$dotest/patch" &&
131 GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
132 git write-tree >"$dotest/patch-merge-base+" ||
133 cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
135 say Using index info to reconstruct a base tree...
136 if GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
137 git apply --cached <"$dotest/patch"
138 then
139 mv "$dotest/patch-merge-base+" "$dotest/patch-merge-base"
140 mv "$dotest/patch-merge-tmp-index" "$dotest/patch-merge-index"
141 else
142 cannot_fallback "Did you hand edit your patch?
143 It does not apply to blobs recorded in its index."
146 test -f "$dotest/patch-merge-index" &&
147 his_tree=$(GIT_INDEX_FILE="$dotest/patch-merge-index" git write-tree) &&
148 orig_tree=$(cat "$dotest/patch-merge-base") &&
149 rm -fr "$dotest"/patch-merge-* || exit 1
151 say Falling back to patching base and 3-way merge...
153 # This is not so wrong. Depending on which base we picked,
154 # orig_tree may be wildly different from ours, but his_tree
155 # has the same set of wildly different changes in parts the
156 # patch did not touch, so recursive ends up canceling them,
157 # saying that we reverted all those changes.
159 eval GITHEAD_$his_tree='"$FIRSTLINE"'
160 export GITHEAD_$his_tree
161 if test -n "$GIT_QUIET"
162 then
163 GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
165 git-merge-recursive $orig_tree -- HEAD $his_tree || {
166 git rerere $allow_rerere_autoupdate
167 echo Failed to merge in the changes.
168 exit 1
170 unset GITHEAD_$his_tree
173 clean_abort () {
174 test $# = 0 || echo >&2 "$@"
175 rm -fr "$dotest"
176 exit 1
179 patch_format=
181 check_patch_format () {
182 # early return if patch_format was set from the command line
183 if test -n "$patch_format"
184 then
185 return 0
188 # we default to mbox format if input is from stdin and for
189 # directories
190 if test $# = 0 || test "x$1" = "x-" || test -d "$1"
191 then
192 patch_format=mbox
193 return 0
196 # otherwise, check the first few lines of the first patch to try
197 # to detect its format
199 read l1
200 read l2
201 read l3
202 case "$l1" in
203 "From "* | "From: "*)
204 patch_format=mbox
206 '# This series applies on GIT commit'*)
207 patch_format=stgit-series
209 "# HG changeset patch")
210 patch_format=hg
213 # if the second line is empty and the third is
214 # a From, Author or Date entry, this is very
215 # likely an StGIT patch
216 case "$l2,$l3" in
217 ,"From: "* | ,"Author: "* | ,"Date: "*)
218 patch_format=stgit
222 esac
224 esac
225 if test -z "$patch_format" &&
226 test -n "$l1" &&
227 test -n "$l2" &&
228 test -n "$l3"
229 then
230 # This begins with three non-empty lines. Is this a
231 # piece of e-mail a-la RFC2822? Grab all the headers,
232 # discarding the indented remainder of folded lines,
233 # and see if it looks like that they all begin with the
234 # header field names...
235 tr -d '\015' <"$1" |
236 sed -n -e '/^$/q' -e '/^[ ]/d' -e p |
237 sane_egrep -v '^[!-9;-~]+:' >/dev/null ||
238 patch_format=mbox
240 } < "$1" || clean_abort
243 split_patches () {
244 case "$patch_format" in
245 mbox)
246 if test -n "$rebasing" || test t = "$keepcr"
247 then
248 keep_cr=--keep-cr
249 else
250 keep_cr=
252 git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
253 clean_abort
255 stgit-series)
256 if test $# -ne 1
257 then
258 clean_abort "Only one StGIT patch series can be applied at once"
260 series_dir=`dirname "$1"`
261 series_file="$1"
262 shift
264 set x
265 while read filename
267 set "$@" "$series_dir/$filename"
268 done
269 # remove the safety x
270 shift
271 # remove the arg coming from the first-line comment
272 shift
273 } < "$series_file" || clean_abort
274 # set the patch format appropriately
275 patch_format=stgit
276 # now handle the actual StGIT patches
277 split_patches "$@"
279 stgit)
280 this=0
281 for stgit in "$@"
283 this=`expr "$this" + 1`
284 msgnum=`printf "%0${prec}d" $this`
285 # Perl version of StGIT parse_patch. The first nonemptyline
286 # not starting with Author, From or Date is the
287 # subject, and the body starts with the next nonempty
288 # line not starting with Author, From or Date
289 perl -ne 'BEGIN { $subject = 0 }
290 if ($subject > 1) { print ; }
291 elsif (/^\s+$/) { next ; }
292 elsif (/^Author:/) { print s/Author/From/ ; }
293 elsif (/^(From|Date)/) { print ; }
294 elsif ($subject) {
295 $subject = 2 ;
296 print "\n" ;
297 print ;
298 } else {
299 print "Subject: ", $_ ;
300 $subject = 1;
302 ' < "$stgit" > "$dotest/$msgnum" || clean_abort
303 done
304 echo "$this" > "$dotest/last"
305 this=
306 msgnum=
309 if test -n "$parse_patch" ; then
310 clean_abort "Patch format $patch_format is not supported."
311 else
312 clean_abort "Patch format detection failed."
315 esac
318 prec=4
319 dotest="$GIT_DIR/rebase-apply"
320 sign= utf8=t keep= keepcr= skip= interactive= resolved= rebasing= abort=
321 resolvemsg= resume= scissors= no_inbody_headers=
322 git_apply_opt=
323 committer_date_is_author_date=
324 ignore_date=
325 allow_rerere_autoupdate=
327 if test "$(git config --bool --get am.keepcr)" = true
328 then
329 keepcr=t
332 while test $# != 0
334 case "$1" in
335 -i|--interactive)
336 interactive=t ;;
337 -b|--binary)
338 : ;;
339 -3|--3way)
340 threeway=t ;;
341 -s|--signoff)
342 sign=t ;;
343 -u|--utf8)
344 utf8=t ;; # this is now default
345 --no-utf8)
346 utf8= ;;
347 -k|--keep)
348 keep=t ;;
349 --keep-non-patch)
350 keep=b ;;
351 -c|--scissors)
352 scissors=t ;;
353 --no-scissors)
354 scissors=f ;;
355 -r|--resolved|--continue)
356 resolved=t ;;
357 --skip)
358 skip=t ;;
359 --abort)
360 abort=t ;;
361 --rebasing)
362 rebasing=t threeway=t keep=t scissors=f no_inbody_headers=t ;;
363 -d|--dotest)
364 die "-d option is no longer supported. Do not use."
366 --resolvemsg)
367 shift; resolvemsg=$1 ;;
368 --whitespace|--directory)
369 git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;;
370 -C|-p)
371 git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;;
372 --patch-format)
373 shift ; patch_format="$1" ;;
374 --reject|--ignore-whitespace|--ignore-space-change)
375 git_apply_opt="$git_apply_opt $1" ;;
376 --committer-date-is-author-date)
377 committer_date_is_author_date=t ;;
378 --ignore-date)
379 ignore_date=t ;;
380 --rerere-autoupdate|--no-rerere-autoupdate)
381 allow_rerere_autoupdate="$1" ;;
382 -q|--quiet)
383 GIT_QUIET=t ;;
384 --keep-cr)
385 keepcr=t ;;
386 --no-keep-cr)
387 keepcr=f ;;
389 shift; break ;;
391 usage ;;
392 esac
393 shift
394 done
396 # If the dotest directory exists, but we have finished applying all the
397 # patches in them, clear it out.
398 if test -d "$dotest" &&
399 last=$(cat "$dotest/last") &&
400 next=$(cat "$dotest/next") &&
401 test $# != 0 &&
402 test "$next" -gt "$last"
403 then
404 rm -fr "$dotest"
407 if test -d "$dotest"
408 then
409 case "$#,$skip$resolved$abort" in
410 0,*t*)
411 # Explicit resume command and we do not have file, so
412 # we are happy.
413 : ;;
415 # No file input but without resume parameters; catch
416 # user error to feed us a patch from standard input
417 # when there is already $dotest. This is somewhat
418 # unreliable -- stdin could be /dev/null for example
419 # and the caller did not intend to feed us a patch but
420 # wanted to continue unattended.
421 test -t 0
424 false
426 esac ||
427 die "previous rebase directory $dotest still exists but mbox given."
428 resume=yes
430 case "$skip,$abort" in
431 t,t)
432 die "Please make up your mind. --skip or --abort?"
435 git rerere clear
436 git read-tree --reset -u HEAD HEAD
437 orig_head=$(cat "$GIT_DIR/ORIG_HEAD")
438 git reset HEAD
439 git update-ref ORIG_HEAD $orig_head
442 if test -f "$dotest/rebasing"
443 then
444 exec git rebase --abort
446 git rerere clear
447 if safe_to_abort
448 then
449 git read-tree --reset -u HEAD ORIG_HEAD
450 git reset ORIG_HEAD
452 rm -fr "$dotest"
453 exit ;;
454 esac
455 rm -f "$dotest/dirtyindex"
456 else
457 # Make sure we are not given --skip, --resolved, nor --abort
458 test "$skip$resolved$abort" = "" ||
459 die "Resolve operation not in progress, we are not resuming."
461 # Start afresh.
462 mkdir -p "$dotest" || exit
464 if test -n "$prefix" && test $# != 0
465 then
466 first=t
467 for arg
469 test -n "$first" && {
470 set x
471 first=
473 if is_absolute_path "$arg"
474 then
475 set "$@" "$arg"
476 else
477 set "$@" "$prefix$arg"
479 done
480 shift
483 check_patch_format "$@"
485 split_patches "$@"
487 # -i can and must be given when resuming; everything
488 # else is kept
489 echo " $git_apply_opt" >"$dotest/apply-opt"
490 echo "$threeway" >"$dotest/threeway"
491 echo "$sign" >"$dotest/sign"
492 echo "$utf8" >"$dotest/utf8"
493 echo "$keep" >"$dotest/keep"
494 echo "$keepcr" >"$dotest/keepcr"
495 echo "$scissors" >"$dotest/scissors"
496 echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
497 echo "$GIT_QUIET" >"$dotest/quiet"
498 echo 1 >"$dotest/next"
499 if test -n "$rebasing"
500 then
501 : >"$dotest/rebasing"
502 else
503 : >"$dotest/applying"
504 if test -n "$HAS_HEAD"
505 then
506 git update-ref ORIG_HEAD HEAD
507 else
508 git update-ref -d ORIG_HEAD >/dev/null 2>&1
513 case "$resolved" in
515 case "$HAS_HEAD" in
517 files=$(git ls-files) ;;
519 files=$(git diff-index --cached --name-only HEAD --) ;;
520 esac || exit
521 if test "$files"
522 then
523 test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
524 die "Dirty index: cannot apply patches (dirty: $files)"
526 esac
528 # Now, decide what command line options we will give to the git
529 # commands we invoke, based on the result of parsing command line
530 # options and previous invocation state stored in $dotest/ files.
532 if test "$(cat "$dotest/utf8")" = t
533 then
534 utf8=-u
535 else
536 utf8=-n
538 keep=$(cat "$dotest/keep")
539 case "$keep" in
541 keep=-k ;;
543 keep=-b ;;
545 keep= ;;
546 esac
547 case "$(cat "$dotest/keepcr")" in
549 keepcr=--keep-cr ;;
551 keepcr=--no-keep-cr ;;
552 esac
553 case "$(cat "$dotest/scissors")" in
555 scissors=--scissors ;;
557 scissors=--no-scissors ;;
558 esac
559 if test "$(cat "$dotest/no_inbody_headers")" = t
560 then
561 no_inbody_headers=--no-inbody-headers
562 else
563 no_inbody_headers=
565 if test "$(cat "$dotest/quiet")" = t
566 then
567 GIT_QUIET=t
569 if test "$(cat "$dotest/threeway")" = t
570 then
571 threeway=t
573 git_apply_opt=$(cat "$dotest/apply-opt")
574 if test "$(cat "$dotest/sign")" = t
575 then
576 SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
577 s/>.*/>/
578 s/^/Signed-off-by: /'
580 else
581 SIGNOFF=
584 last=`cat "$dotest/last"`
585 this=`cat "$dotest/next"`
586 if test "$skip" = t
587 then
588 this=`expr "$this" + 1`
589 resume=
592 while test "$this" -le "$last"
594 msgnum=`printf "%0${prec}d" $this`
595 next=`expr "$this" + 1`
596 test -f "$dotest/$msgnum" || {
597 resume=
598 go_next
599 continue
602 # If we are not resuming, parse and extract the patch information
603 # into separate files:
604 # - info records the authorship and title
605 # - msg is the rest of commit log message
606 # - patch is the patch body.
608 # When we are resuming, these files are either already prepared
609 # by the user, or the user can tell us to do so by --resolved flag.
610 case "$resume" in
612 git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
613 <"$dotest/$msgnum" >"$dotest/info" ||
614 stop_here $this
616 # skip pine's internal folder data
617 sane_grep '^Author: Mail System Internal Data$' \
618 <"$dotest"/info >/dev/null &&
619 go_next && continue
621 test -s "$dotest/patch" || {
622 echo "Patch is empty. Was it split wrong?"
623 echo "If you would prefer to skip this patch, instead run \"$cmdline --skip\"."
624 echo "To restore the original branch and stop patching run \"$cmdline --abort\"."
625 stop_here $this
627 rm -f "$dotest/original-commit" "$dotest/author-script"
628 if test -f "$dotest/rebasing" &&
629 commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
630 -e q "$dotest/$msgnum") &&
631 test "$(git cat-file -t "$commit")" = commit
632 then
633 git cat-file commit "$commit" |
634 sed -e '1,/^$/d' >"$dotest/msg-clean"
635 echo "$commit" > "$dotest/original-commit"
636 get_author_ident_from_commit "$commit" > "$dotest/author-script"
637 else
639 sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
640 echo
641 cat "$dotest/msg"
643 git stripspace > "$dotest/msg-clean"
646 esac
648 if test -f "$dotest/author-script"
649 then
650 eval $(cat "$dotest/author-script")
651 else
652 GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
653 GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
654 GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
657 if test -z "$GIT_AUTHOR_EMAIL"
658 then
659 echo "Patch does not have a valid e-mail address."
660 stop_here $this
663 export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
665 case "$resume" in
667 if test '' != "$SIGNOFF"
668 then
669 LAST_SIGNED_OFF_BY=`
670 sed -ne '/^Signed-off-by: /p' \
671 "$dotest/msg-clean" |
672 sed -ne '$p'
674 ADD_SIGNOFF=`
675 test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
676 test '' = "$LAST_SIGNED_OFF_BY" && echo
677 echo "$SIGNOFF"
679 else
680 ADD_SIGNOFF=
683 if test -s "$dotest/msg-clean"
684 then
685 cat "$dotest/msg-clean"
687 if test '' != "$ADD_SIGNOFF"
688 then
689 echo "$ADD_SIGNOFF"
691 } >"$dotest/final-commit"
694 case "$resolved$interactive" in
696 # This is used only for interactive view option.
697 git diff-index -p --cached HEAD -- >"$dotest/patch"
699 esac
700 esac
702 resume=
703 if test "$interactive" = t
704 then
705 test -t 0 ||
706 die "cannot be interactive without stdin connected to a terminal."
707 action=again
708 while test "$action" = again
710 echo "Commit Body is:"
711 echo "--------------------------"
712 cat "$dotest/final-commit"
713 echo "--------------------------"
714 printf "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
715 read reply
716 case "$reply" in
717 [yY]*) action=yes ;;
718 [aA]*) action=yes interactive= ;;
719 [nN]*) action=skip ;;
720 [eE]*) git_editor "$dotest/final-commit"
721 action=again ;;
722 [vV]*) action=again
723 git_pager "$dotest/patch" ;;
724 *) action=again ;;
725 esac
726 done
727 else
728 action=yes
731 if test -f "$dotest/final-commit"
732 then
733 FIRSTLINE=$(sed 1q "$dotest/final-commit")
734 else
735 FIRSTLINE=""
738 if test $action = skip
739 then
740 go_next
741 continue
744 if test -x "$GIT_DIR"/hooks/applypatch-msg
745 then
746 "$GIT_DIR"/hooks/applypatch-msg "$dotest/final-commit" ||
747 stop_here $this
750 say "Applying: $FIRSTLINE"
752 case "$resolved" in
754 # When we are allowed to fall back to 3-way later, don't give
755 # false errors during the initial attempt.
756 squelch=
757 if test "$threeway" = t
758 then
759 squelch='>/dev/null 2>&1 '
761 eval "git apply $squelch$git_apply_opt"' --index "$dotest/patch"'
762 apply_status=$?
765 # Resolved means the user did all the hard work, and
766 # we do not have to do any patch application. Just
767 # trust what the user has in the index file and the
768 # working tree.
769 resolved=
770 git diff-index --quiet --cached HEAD -- && {
771 echo "No changes - did you forget to use 'git add'?"
772 echo "If there is nothing left to stage, chances are that something else"
773 echo "already introduced the same changes; you might want to skip this patch."
774 stop_here_user_resolve $this
776 unmerged=$(git ls-files -u)
777 if test -n "$unmerged"
778 then
779 echo "You still have unmerged paths in your index"
780 echo "did you forget to use 'git add'?"
781 stop_here_user_resolve $this
783 apply_status=0
784 git rerere
786 esac
788 if test $apply_status != 0 && test "$threeway" = t
789 then
790 if (fall_back_3way)
791 then
792 # Applying the patch to an earlier tree and merging the
793 # result may have produced the same tree as ours.
794 git diff-index --quiet --cached HEAD -- && {
795 say No changes -- Patch already applied.
796 go_next
797 continue
799 # clear apply_status -- we have successfully merged.
800 apply_status=0
803 if test $apply_status != 0
804 then
805 printf 'Patch failed at %s %s\n' "$msgnum" "$FIRSTLINE"
806 stop_here_user_resolve $this
809 if test -x "$GIT_DIR"/hooks/pre-applypatch
810 then
811 "$GIT_DIR"/hooks/pre-applypatch || stop_here $this
814 tree=$(git write-tree) &&
815 commit=$(
816 if test -n "$ignore_date"
817 then
818 GIT_AUTHOR_DATE=
820 parent=$(git rev-parse --verify -q HEAD) ||
821 say >&2 "applying to an empty history"
823 if test -n "$committer_date_is_author_date"
824 then
825 GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
826 export GIT_COMMITTER_DATE
827 fi &&
828 git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
829 ) &&
830 git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
831 stop_here $this
833 if test -f "$dotest/original-commit"; then
834 echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
837 if test -x "$GIT_DIR"/hooks/post-applypatch
838 then
839 "$GIT_DIR"/hooks/post-applypatch
842 go_next
843 done
845 if test -s "$dotest"/rewritten; then
846 git notes copy --for-rewrite=rebase < "$dotest"/rewritten
847 if test -x "$GIT_DIR"/hooks/post-rewrite; then
848 "$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
852 rm -fr "$dotest"
853 git gc --auto