diff options
| author | Neil Horman <nhorman@tuxdriver.com> | 2012-04-20 10:36:17 -0400 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2012-04-24 15:24:14 -0700 | 
| commit | 90e1818f9a06015159712e204dd90868e0a6c421 (patch) | |
| tree | 7f67e462df570c25739263c3f181fff63c129133 /git-rebase--interactive.sh | |
| parent | bedfe86ce6ccee90e2cbecbf8d72e06219a2768a (diff) | |
| download | git-90e1818f9a06015159712e204dd90868e0a6c421.tar.gz | |
git-rebase: add keep_empty flag
Add a command line switch to git-rebase to allow a user the ability to specify
that they want to keep any commits in a series that are empty.
When git-rebase's type is am, then this option will automatically keep any
commit that has a tree object identical to its parent.
This patch changes the default behavior of interactive rebases as well.  With
this patch, git-rebase -i will produce a revision set passed to
git-revision-editor, in which empty commits are commented out.  Empty commits
may be kept manually by uncommenting them.  If the new --keep-empty option is
used in an interactive rebase the empty commits will automatically all be
uncommented in the editor.
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-rebase--interactive.sh')
| -rw-r--r-- | git-rebase--interactive.sh | 35 | 
1 files changed, 32 insertions, 3 deletions
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 5812222eb9..70538bb20f 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -167,6 +167,14 @@ has_action () {  	sane_grep '^[^#]' "$1" >/dev/null  } +is_empty_commit() { +	tree=$(git rev-parse -q --verify "$1"^{tree} 2>/dev/null || +		die "$1: not a commit that can be picked") +	ptree=$(git rev-parse -q --verify "$1"^^{tree} 2>/dev/null || +		ptree=4b825dc642cb6eb9a060e54bf8d69288fbee4904) +	test "$tree" = "$ptree" +} +  # Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and  # GIT_AUTHOR_DATE exported from the current environment.  do_with_author () { @@ -191,12 +199,19 @@ git_sequence_editor () {  pick_one () {  	ff=--ff +  	case "$1" in -n) sha1=$2; ff= ;; *) sha1=$1 ;; esac  	case "$force_rebase" in '') ;; ?*) ff= ;; esac  	output git rev-parse --verify $sha1 || die "Invalid commit name: $sha1" + +	if is_empty_commit "$sha1" +	then +		empty_args="--allow-empty" +	fi +  	test -d "$rewritten" &&  		pick_one_preserving_merges "$@" && return -	output git cherry-pick $ff "$@" +	output git cherry-pick $empty_args $ff "$@"  }  pick_one_preserving_merges () { @@ -780,9 +795,17 @@ git rev-list $merges_option --pretty=oneline --abbrev-commit \  	sed -n "s/^>//p" |  while read -r shortsha1 rest  do + +	if test -z "$keep_empty" && is_empty_commit $shortsha1 +	then +		comment_out="# " +	else +		comment_out= +	fi +  	if test t != "$preserve_merges"  	then -		printf '%s\n' "pick $shortsha1 $rest" >> "$todo" +		printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo"  	else  		sha1=$(git rev-parse $shortsha1)  		if test -z "$rebase_root" @@ -801,7 +824,7 @@ do  		if test f = "$preserve"  		then  			touch "$rewritten"/$sha1 -			printf '%s\n' "pick $shortsha1 $rest" >> "$todo" +			printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo"  		fi  	fi  done @@ -851,6 +874,12 @@ cat >> "$todo" << EOF  #  EOF +if test -z "$keep_empty" +then +	echo "# Note that empty commits are commented out" >>"$todo" +fi + +  has_action "$todo" ||  	die_abort "Nothing to do"  | 
