With this new option tags set on commits, they are part of a rebase, are reset to the rebased commits. This way the tags on a branch are kept across rebases. Signed-off-by: Jörg Sommer <joerg@xxxxxxxxxxxx> --- Documentation/git-rebase.txt | 6 ++++- git-rebase--interactive.sh | 42 ++++++++++++++++++++++++++++++++++++++-- t/t3404-rebase-interactive.sh | 10 +++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 9ebbb90..cc4e94f 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -11,7 +11,8 @@ SYNOPSIS 'git-rebase' [-i | --interactive] [-v | --verbose] [-m | --merge] [-s <strategy> | --strategy=<strategy>] [-C<n>] [ --whitespace=<option>] [-p | --preserve-merges] - [-f | --first-parent] [--onto <newbase>] <upstream> [<branch>] + [-f | --first-parent] [-t | --preserve-tags] + [--onto <newbase>] <upstream> [<branch>] 'git-rebase' --continue | --skip | --abort DESCRIPTION @@ -252,6 +253,9 @@ OPTIONS showing all commits from the merged branches show only the commits and merges following the first parent of each commit. +-t, \--preserve-tags:: + If one of the commits has a tag, reset it to the new commit object. + include::merge-strategies.txt[] NOTES diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index c601655..e874c31 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -11,7 +11,7 @@ # http://article.gmane.org/gmane.comp.version-control.git/22407 USAGE='(--continue | --abort | --skip | [--preserve-merges] [--first-parent] - [--verbose] [--onto <branch>] <upstream> [<branch>])' + [--preserve-tags] [--verbose] [--onto <branch>] <upstream> [<branch>])' OPTIONS_SPEC= . git-sh-setup @@ -397,9 +397,31 @@ insert_value_at_key_into_list () { create_extended_todo_list () { ( + if test t = "${PRESERVE_TAGS:-}" + then + tag_list=$(git show-ref --abbrev=7 --tags | \ + ( + while read sha1 tag + do + tag=${tag#refs/tags/} + if test ${last_sha1:-0000} = $sha1 + then + saved_tags="$saved_tags:$tag" + else + printf "%s" "${last_sha1:+ $last_sha1#$saved_tags}" + last_sha1=$sha1 + saved_tags=$tag + fi + done + echo "${last_sha1:+ $last_sha1:$saved_tags}" + ) ) + else + tag_list= + fi while IFS=_ read commit parents subject do - if test "${last_parent:-$commit}" != "$commit" + if test t = "$PRESERVE_MERGES" -a \ + "${last_parent:-$commit}" != "$commit" then if test t = "${delayed_mark:-f}" then @@ -416,6 +438,14 @@ create_extended_todo_list () { get_value_from_list $commit "${marked_commits:-}" \ >/dev/null && echo mark + if tmp=$(get_value_from_list $commit "$tag_list") + then + for t in $(echo $tmp | tr : ' ') + do + echo tag $t + done + fi + case "$parents" in *' '*) delayed_mark=t @@ -575,6 +605,9 @@ do FIRST_PARENT=t PRESERVE_MERGES=t ;; + -t|--preserve-tags) + PRESERVE_TAGS=t + ;; -i|--interactive) # yeah, we know ;; @@ -631,11 +664,14 @@ do SHORTONTO=$(git rev-parse --short=7 $ONTO) common_rev_list_opts="--abbrev-commit --abbrev=7 --left-right --cherry-pick $UPSTREAM...$HEAD" - if test t = "$PRESERVE_MERGES" -o t = "${FIRST_PARENT:-f}" + if test t = "$PRESERVE_MERGES" -o t = "${FIRST_PARENT:-f}" \ + -o t = "${PRESERVE_TAGS:-}" then opts= test t = "${FIRST_PARENT:-f}" && \ opts="$opts --first-parent" + test t != "$PRESERVE_MERGES" && \ + opts="$opts --no-merges" git rev-list --pretty='format:%h_%p_%s' --topo-order \ $opts $common_rev_list_opts | \ grep -v ^commit | \ diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 9901555..d20ed4f 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -319,6 +319,16 @@ test_expect_success 'tag sets tags' ' "$(git rev-parse HEAD^2~2 HEAD~2 HEAD~1 HEAD~1)" ' +test_expect_success 'interactive -t preserves tags' ' + git rebase -i -p -t --onto dead-end master && + test "$(git rev-parse bb-tag1 bb-tag2 bb-tag3a bb-tag3b)" = \ + "$(git rev-parse HEAD^2~2 HEAD~2 HEAD~1 HEAD~1)" && + head=$(git rev-parse HEAD) && + git rebase -i -t dead-end && + test "$(git rev-parse bb-tag1 bb-tag2 bb-tag3a bb-tag3b)" = \ + "$(git rev-parse HEAD~7 $head~2 HEAD~1 HEAD~1)" +' + test_expect_success '--continue tries to commit' ' git checkout to-be-rebased && test_tick && -- 1.5.5 -- 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