diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2014-03-11 14:27:18 +0200 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2014-05-18 23:39:35 +0300 |
commit | 1a1a086cf2d70eac35af05fc76fc78991c46f025 (patch) | |
tree | 1e39b2d0d7128d0abfd134244fc529643f196eee | |
parent | 1a51ab16661185688c09175ef5ef883c3e61e616 (diff) | |
download | git-1a1a086cf2d70eac35af05fc76fc78991c46f025.tar.gz |
rebase -i: add ack action
This implements a new ack! action for git rebase -i
It is essentially a middle ground between fixup! and squash!:
- commits are squashed silently without editor being started
- commit logs are concatenated (with action line being discarded)
- because of the above, empty commits aren't discarded,
their log is also included.
I am using it as follows:
git am -s < mailbox #creates first commit
hack ...
get mail with Ack
git commit --allow-empty -m `cat <<-EOF
ack! first
Acked-by: maintainer
EOF`
repeat cycle
git rebase --autosquash -i origin/master
before public branch push
The "cat" command above is actually a script that
parses the Ack mail to create the empty commit -
to be submitted separately.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r-- | git-rebase--interactive.sh | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 6ec9d3cb40..821872c03d 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -140,6 +140,7 @@ Commands: r, reword = use commit, but edit the commit message e, edit = use commit, but stop for amending s, squash = use commit, but meld into previous commit + a, ack = like "squash", but append commit body only to previous commit f, fixup = like "squash", but discard this commit's log message x, exec = run command (the rest of the line) using shell @@ -412,6 +413,15 @@ update_squash_messages () { echo commit_message $2 ;; + ack) + if test -f "$fixup_msg" + then + commit_message $2 | git stripspace --strip-comments | sed -e '1,2d' >> "$fixup_msg" + fi + printf '%s\n' "$comment_char This is the $(nth_string $count) commit message:" + echo + commit_message $2 + ;; fixup) echo printf '%s\n' "$comment_char The $(nth_string $count) commit message will be skipped:" @@ -453,7 +463,7 @@ record_in_rewritten() { echo "$oldsha1" >> "$rewritten_pending" case "$(peek_next_command)" in - squash|s|fixup|f) + squash|s|fixup|f|ack|a) ;; *) flush_rewritten_pending @@ -521,8 +531,11 @@ do_next () { warn "Stopped at $sha1... $rest" exit_with_patch $sha1 0 ;; - squash|s|fixup|f) + squash|s|fixup|f|ack|a) case "$command" in + ack|a) + squash_style=ack + ;; squash|s) squash_style=squash ;; @@ -546,7 +559,7 @@ do_next () { die_failed_squash $sha1 "$rest" fi case "$(peek_next_command)" in - squash|s|fixup|f) + squash|s|fixup|f|ack|a) # This is an intermediate commit; its message will only be # used in case of trouble. So use the long version: do_with_author output git commit --amend --no-verify -F "$squash_msg" \ @@ -557,7 +570,7 @@ do_next () { # This is the final command of this squash/fixup group if test -f "$fixup_msg" then - do_with_author git commit --amend --no-verify -F "$fixup_msg" \ + do_with_author git commit --quiet --amend --no-verify -F "$fixup_msg" \ ${gpg_sign_opt:+"$gpg_sign_opt"} || die_failed_squash $sha1 "$rest" else @@ -690,7 +703,7 @@ skip_unnecessary_picks () { done <"$todo" >"$todo.new" 3>>"$done" && mv -f "$todo".new "$todo" && case "$(peek_next_command)" in - squash|s|fixup|f) + squash|s|fixup|f|ack|a) record_in_rewritten "$onto" ;; esac || @@ -732,7 +745,7 @@ rearrange_squash () { while read -r pick sha1 message do case "$message" in - "squash! "*|"fixup! "*) + "squash! "*|"fixup! "*|"ack! "*) action="${message%%!*}" rest=$message prefix= @@ -740,7 +753,7 @@ rearrange_squash () { while : do case "$rest" in - "squash! "*|"fixup! "*) + "squash! "*|"fixup! "* |"ack! "*) prefix="$prefix${rest%%!*}," rest="${rest#*! }" ;; @@ -975,6 +988,13 @@ do comment_out= fi + # keep empty ack! commits around: useful to add text to commit log + case "$rest" in + "ack! "*) + comment_out= + ;; + esac + if test t != "$preserve_merges" then printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo" |