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@xxxxxxxxxx> --- git-rebase--interactive.sh | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 6ec9d3c..821872c 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" -- MST -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html