{"thread":{"id":"15761","subject":"git rebase -- a suggestion","startedAt":"2008-10-03T00:10:17Z","lastAt":"2008-10-06T16:14:24Z","messageCount":7,"participants":["Robin Burchell","Nanako Shiraishi","Shawn O. Pearce","Stephan Beyer"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"92207","messageId":"b19eae4e0810021710v14a3901an1f793de00c439ba1@mail.gmail.com","threadId":"15761","inReplyTo":null,"subject":"git rebase -- a suggestion","fromName":"Robin Burchell","fromEmail":"w00t@inspircd.org","sentAt":"2008-10-03T00:10:17Z","receivedAt":"2008-10-03T00:10:17Z","isPatch":false,"sender":{"key":"w00t@inspircd.org","avatar":null},"body":"Hi,\n\nThis is my first mail to this list, so I hope I'm not breaking any\nform of ettiquette, etc. If I do step on any toes, feel free to bop me\non the head with a rubber mallet, or steer me in the right direction.\n\nThat over, I have a suggestion for `git rebase', from the perspective\nof a newcomer.\n\nI've been using git instead of svn (and various other VCS) now for\nabout a month, and am finding it quite a refreshing change.\n\nI have also recently started a collaborative project exclusively with\ngit (well, pulling changes from a git-svn repo I don't control) which\nhas been a valuable ..learning experience.\n\nWith this in mind, I'd like to mention exactly what I did.\n\nUpstream had issued a new commit, so I, not knowing the possible\ndangers used git-svn rebase to pull in the new changes to our tree.\n\nThis \"appeared\" to work fine, but alarm bells were already going off\nin my head before I typed the command (I didn't know at the time I\ncould merge svn trees like I could normal git branches) as I knew that\nrebase rewrote history, and I saw it do this to about 300 commits.\n\nIt promptly made merging absolute hell with the other few members of\nmy team, as it would.\n\nGranted - this is a mistake on my part, and probably a common newbie\none, but something that came to mind when thinking about it later:\nwould it perhaps be an idea to have a way to mark a tree 'public', and\ndisallow rebase *unless* --force was passed, or it was a public tree?\n\n(Then again, the alternative might be more 'intelligent' for new\nusers: start off with branches defaulting to private, and marking them\npublic, disallowing use of rebase, etc).\n\nThoughts, feedback, etc are welcome.\n\n-- \nRobin Burchell\n"},{"id":"92332","messageId":"20081005222654.6117@nanako3.lavabit.com","threadId":"15761","inReplyTo":"b19eae4e0810021710v14a3901an1f793de00c439ba1@mail.gmail.com","subject":"Re: git rebase -- a suggestion","fromName":"Nanako Shiraishi","fromEmail":"nanako3@lavabit.com","sentAt":"2008-10-05T13:26:54Z","receivedAt":"2008-10-05T13:26:54Z","isPatch":false,"sender":{"key":"nanako3@lavabit.com","avatar":"https://gravatar.com/avatar/3777b9e201c5883a62b1a6fdf7c53f2d712d1d80989146063ea861e33aad72a8?d=mp&s=160"},"body":"Documentation/git-rebase.txt talks about pre-rebase hook, but\nit appears that Documentation/git-hooks.txt does not have corresponding\nentry for it.\n\nSigned-off-by: Nanako Shiraishi <nanako3@lavabit.com>\n---\n \"Robin Burchell\" <w00t@inspircd.org> writes:\n\n > would it perhaps be an idea to have a way to mark a tree 'public', and\n > disallow rebase *unless* --force was passed, or it was a public tree?\n\n Documentation/githooks.txt |    7 +++++++\n 1 files changed, 7 insertions(+), 0 deletions(-)\n\ndiff --git a/Documentation/githooks.txt b/Documentation/githooks.txt\nindex 046a2a7..567ec03 100644\n--- a/Documentation/githooks.txt\n+++ b/Documentation/githooks.txt\n@@ -130,6 +130,13 @@ parameter, and is invoked after a commit is made.\n This hook is meant primarily for notification, and cannot affect\n the outcome of 'git-commit'.\n \n+pre-rebase\n+----------\n+\n+This hook is called by 'git-rebase' and can be used to prevent a branch\n+from getting rebased.\n+\n+\n post-checkout\n -----------\n \n\n-- \nNanako Shiraishi\nhttp://ivory.ap.teacup.com/nanako3/\n"},{"id":"92385","messageId":"20081006141424.6117@nanako3.lavabit.com","threadId":"15761","inReplyTo":"20081005222654.6117@nanako3.lavabit.com","subject":"[PATCH] Teach rebase -i to honor pre-rebase hook","fromName":"Nanako Shiraishi","fromEmail":"nanako3@lavabit.com","sentAt":"2008-10-06T05:14:24Z","receivedAt":"2008-10-06T05:14:24Z","isPatch":true,"sender":{"key":"nanako3@lavabit.com","avatar":"https://gravatar.com/avatar/3777b9e201c5883a62b1a6fdf7c53f2d712d1d80989146063ea861e33aad72a8?d=mp&s=160"},"body":"The original git-rebase honored pre-rebase hook so that public branches\ncan be protected from getting rebased, but rebase --interactive ignored\nthe hook entirely.  This fixes it.\n\nSigned-off-by: Nanako Shiraishi <nanako3@lavabit.com>\n---\n git-rebase--interactive.sh |   11 ++++\n git-rebase.sh              |   18 ++++---\n t/t3409-rebase-hook.sh     |  126 ++++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 148 insertions(+), 7 deletions(-)\n create mode 100755 t/t3409-rebase-hook.sh\n\ndiff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh\nindex edb6ec6..3350f90 100755\n--- a/git-rebase--interactive.sh\n+++ b/git-rebase--interactive.sh\n@@ -65,6 +65,16 @@ output () {\n \tesac\n }\n \n+run_pre_rebase_hook () {\n+\tif test -x \"$GIT_DIR/hooks/pre-rebase\"\n+\tthen\n+\t\t\"$GIT_DIR/hooks/pre-rebase\" ${1+\"$@\"} || {\n+\t\t\techo >&2 \"The pre-rebase hook refused to rebase.\"\n+\t\t\texit 1\n+\t\t}\n+\tfi\n+}\n+\n require_clean_work_tree () {\n \t# test if working tree is dirty\n \tgit rev-parse --verify HEAD > /dev/null &&\n@@ -507,6 +517,7 @@ first and then run 'git rebase --continue' again.\"\n \t\t;;\n \t--)\n \t\tshift\n+\t\trun_pre_rebase_hook ${1+\"$@\"}\n \t\ttest $# -eq 1 -o $# -eq 2 || usage\n \t\ttest -d \"$DOTEST\" &&\n \t\t\tdie \"Interactive rebase already started\"\ndiff --git a/git-rebase.sh b/git-rebase.sh\nindex 528b604..a30d40c 100755\n--- a/git-rebase.sh\n+++ b/git-rebase.sh\n@@ -144,6 +144,16 @@ is_interactive () {\n \tdone && test -n \"$1\"\n }\n \n+run_pre_rebase_hook () {\n+\tif test -x \"$GIT_DIR/hooks/pre-rebase\"\n+\tthen\n+\t\t\"$GIT_DIR/hooks/pre-rebase\" ${1+\"$@\"} || {\n+\t\t\techo >&2 \"The pre-rebase hook refused to rebase.\"\n+\t\t\texit 1\n+\t\t}\n+\tfi\n+}\n+\n test -f \"$GIT_DIR\"/rebase-apply/applying &&\n \tdie 'It looks like git-am is in progress. Cannot rebase.'\n \n@@ -320,13 +330,7 @@ onto_name=${newbase-\"$upstream_name\"}\n onto=$(git rev-parse --verify \"${onto_name}^0\") || exit\n \n # If a hook exists, give it a chance to interrupt\n-if test -x \"$GIT_DIR/hooks/pre-rebase\"\n-then\n-\t\"$GIT_DIR/hooks/pre-rebase\" ${1+\"$@\"} || {\n-\t\techo >&2 \"The pre-rebase hook refused to rebase.\"\n-\t\texit 1\n-\t}\n-fi\n+run_pre_rebase_hook ${1+\"$@\"}\n \n # If the branch to rebase is given, that is the branch we will rebase\n # $branch_name -- branch being rebased, or HEAD (already detached)\ndiff --git a/t/t3409-rebase-hook.sh b/t/t3409-rebase-hook.sh\nnew file mode 100755\nindex 0000000..bc93dda\n--- /dev/null\n+++ b/t/t3409-rebase-hook.sh\n@@ -0,0 +1,126 @@\n+#!/bin/sh\n+\n+test_description='git rebase with its hook(s)'\n+\n+. ./test-lib.sh\n+\n+test_expect_success setup '\n+\techo hello >file &&\n+\tgit add file &&\n+\ttest_tick &&\n+\tgit commit -m initial &&\n+\techo goodbye >file &&\n+\tgit add file &&\n+\ttest_tick &&\n+\tgit commit -m second &&\n+\tgit checkout -b side HEAD^ &&\n+\techo world >git &&\n+\tgit add git &&\n+\ttest_tick &&\n+\tgit commit -m side &&\n+\tgit checkout master &&\n+\tgit log --pretty=oneline --abbrev-commit --graph --all &&\n+\tgit branch test side\n+'\n+\n+test_expect_success 'rebase' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tgit rebase master &&\n+\ttest \"z$(cat git)\" = zworld\n+'\n+\n+test_expect_success 'rebase -i' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tEDITOR=true git rebase -i master &&\n+\ttest \"z$(cat git)\" = zworld\n+'\n+\n+test_expect_success 'setup pre-rebase hook' '\n+\tmkdir -p .git/hooks &&\n+\tcat >.git/hooks/pre-rebase <<EOF &&\n+#!$SHELL_PATH\n+echo \"\\$1,\\$2\" >.git/PRE-REBASE-INPUT\n+EOF\n+\tchmod +x .git/hooks/pre-rebase\n+'\n+\n+test_expect_success 'pre-rebase hook gets correct input (1)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tgit rebase master &&\n+\ttest \"z$(cat git)\" = zworld &&\n+\ttest \"z$(cat .git/PRE-REBASE-INPUT)\" = zmaster,\n+\n+'\n+\n+test_expect_success 'pre-rebase hook gets correct input (2)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tgit rebase master test &&\n+\ttest \"z$(cat git)\" = zworld &&\n+\ttest \"z$(cat .git/PRE-REBASE-INPUT)\" = zmaster,test\n+'\n+\n+test_expect_success 'pre-rebase hook gets correct input (3)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tgit checkout master &&\n+\tgit rebase master test &&\n+\ttest \"z$(cat git)\" = zworld &&\n+\ttest \"z$(cat .git/PRE-REBASE-INPUT)\" = zmaster,test\n+'\n+\n+test_expect_success 'pre-rebase hook gets correct input (4)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tEDITOR=true git rebase -i master &&\n+\ttest \"z$(cat git)\" = zworld &&\n+\ttest \"z$(cat .git/PRE-REBASE-INPUT)\" = zmaster,\n+\n+'\n+\n+test_expect_success 'pre-rebase hook gets correct input (5)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tEDITOR=true git rebase -i master test &&\n+\ttest \"z$(cat git)\" = zworld &&\n+\ttest \"z$(cat .git/PRE-REBASE-INPUT)\" = zmaster,test\n+'\n+\n+test_expect_success 'pre-rebase hook gets correct input (6)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tgit checkout master &&\n+\tEDITOR=true git rebase -i master test &&\n+\ttest \"z$(cat git)\" = zworld &&\n+\ttest \"z$(cat .git/PRE-REBASE-INPUT)\" = zmaster,test\n+'\n+\n+test_expect_success 'setup pre-rebase hook that fails' '\n+\tmkdir -p .git/hooks &&\n+\tcat >.git/hooks/pre-rebase <<EOF &&\n+#!$SHELL_PATH\n+false\n+EOF\n+\tchmod +x .git/hooks/pre-rebase\n+'\n+\n+test_expect_success 'pre-rebase hook stops rebase (1)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\ttest_must_fail git rebase master &&\n+\ttest \"z$(git symbolic-ref HEAD)\" = zrefs/heads/test &&\n+\ttest 0 = $(git rev-list HEAD...side | wc -l)\n+'\n+\n+test_expect_success 'pre-rebase hook stops rebase (2)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tEDITOR=true test_must_fail git rebase -i master &&\n+\ttest \"z$(git symbolic-ref HEAD)\" = zrefs/heads/test &&\n+\ttest 0 = $(git rev-list HEAD...side | wc -l)\n+'\n+\n+test_done\n-- \n1.6.0.2\n\n-- \nNanako Shiraishi\nhttp://ivory.ap.teacup.com/nanako3/\n"},{"id":"92386","messageId":"20081006141429.6117@nanako3.lavabit.com","threadId":"15761","inReplyTo":"20081005222654.6117@nanako3.lavabit.com","subject":"[PATCH] rebase --no-verify","fromName":"Nanako Shiraishi","fromEmail":"nanako3@lavabit.com","sentAt":"2008-10-06T05:14:29Z","receivedAt":"2008-10-06T05:14:29Z","isPatch":true,"sender":{"key":"nanako3@lavabit.com","avatar":"https://gravatar.com/avatar/3777b9e201c5883a62b1a6fdf7c53f2d712d1d80989146063ea861e33aad72a8?d=mp&s=160"},"body":"It is sometimes desirable to disable the safety net of pre-rebase hook\nwhen the user knows what he is doing (for example, when the original\nchanges on the branch have not been shown to the public yet).\n\nThis teaches --no-verify option to git-rebase, which is similar to the way\npre-commit hook is bypassed by git-commit.\n\nSigned-off-by: Nanako Shiraishi <nanako3@lavabit.com>\n---\n\n    It probably is better to fix \"rebase -i\" to share more code with the main\n    \"rebase\" script to avoid duplicated run-pre-rebase-hook function, but it\n    is beyond what I can do right now.  Perhaps people more smart and\n    beautiful than me can help (^_^;)\n\n git-rebase--interactive.sh |   10 +++++++++-\n git-rebase.sh              |    7 ++++++-\n t/t3409-rebase-hook.sh     |   16 ++++++++++++++++\n 3 files changed, 31 insertions(+), 2 deletions(-)\n\ndiff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh\nindex 3350f90..b0d757d 100755\n--- a/git-rebase--interactive.sh\n+++ b/git-rebase--interactive.sh\n@@ -26,6 +26,7 @@ i,interactive      always used (no-op)\n continue           continue rebasing process\n abort              abort rebasing process and restore original branch\n skip               skip current patch and continue rebasing process\n+no-verify          override pre-rebase hook from stopping the operation\n \"\n \n . git-sh-setup\n@@ -41,6 +42,7 @@ PRESERVE_MERGES=\n STRATEGY=\n ONTO=\n VERBOSE=\n+OK_TO_SKIP_PRE_REBASE=\n \n GIT_CHERRY_PICK_HELP=\"  After resolving the conflicts,\n mark the corrected paths with 'git add <paths>', and\n@@ -66,7 +68,8 @@ output () {\n }\n \n run_pre_rebase_hook () {\n-\tif test -x \"$GIT_DIR/hooks/pre-rebase\"\n+\tif test -z \"$OK_TO_SKIP_PRE_REBASE\" &&\n+\t   test -x \"$GIT_DIR/hooks/pre-rebase\"\n \tthen\n \t\t\"$GIT_DIR/hooks/pre-rebase\" ${1+\"$@\"} || {\n \t\t\techo >&2 \"The pre-rebase hook refused to rebase.\"\n@@ -416,6 +419,11 @@ get_saved_options () {\n while test $# != 0\n do\n \tcase \"$1\" in\n+\t--no-verify)\n+\t\tOK_TO_SKIP_PRE_REBASE=yes\n+\t\t;;\n+\t--verify)\n+\t\t;;\n \t--continue)\n \t\tis_standalone \"$@\" || usage\n \t\tget_saved_options\ndiff --git a/git-rebase.sh b/git-rebase.sh\nindex a30d40c..f2742aa 100755\n--- a/git-rebase.sh\n+++ b/git-rebase.sh\n@@ -34,6 +34,7 @@ set_reflog_action rebase\n require_work_tree\n cd_to_toplevel\n \n+OK_TO_SKIP_PRE_REBASE=\n RESOLVEMSG=\"\n When you have resolved this problem run \\\"git rebase --continue\\\".\n If you would prefer to skip this patch, instead run \\\"git rebase --skip\\\".\n@@ -145,7 +146,8 @@ is_interactive () {\n }\n \n run_pre_rebase_hook () {\n-\tif test -x \"$GIT_DIR/hooks/pre-rebase\"\n+\tif test -z \"$OK_TO_SKIP_PRE_REBASE\" &&\n+\t   test -x \"$GIT_DIR/hooks/pre-rebase\"\n \tthen\n \t\t\"$GIT_DIR/hooks/pre-rebase\" ${1+\"$@\"} || {\n \t\t\techo >&2 \"The pre-rebase hook refused to rebase.\"\n@@ -170,6 +172,9 @@ fi\n while test $# != 0\n do\n \tcase \"$1\" in\n+\t--no-verify)\n+\t\tOK_TO_SKIP_PRE_REBASE=yes\n+\t\t;;\n \t--continue)\n \t\ttest -d \"$dotest\" -o -d \"$GIT_DIR\"/rebase-apply ||\n \t\t\tdie \"No rebase in progress?\"\ndiff --git a/t/t3409-rebase-hook.sh b/t/t3409-rebase-hook.sh\nindex bc93dda..1f1b850 100755\n--- a/t/t3409-rebase-hook.sh\n+++ b/t/t3409-rebase-hook.sh\n@@ -123,4 +123,20 @@ test_expect_success 'pre-rebase hook stops rebase (2)' '\n \ttest 0 = $(git rev-list HEAD...side | wc -l)\n '\n \n+test_expect_success 'rebase --no-verify overrides pre-rebase (1)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tgit rebase --no-verify master &&\n+\ttest \"z$(git symbolic-ref HEAD)\" = zrefs/heads/test &&\n+\ttest \"z$(cat git)\" = zworld\n+'\n+\n+test_expect_success 'rebase --no-verify overrides pre-rebase (2)' '\n+\tgit checkout test &&\n+\tgit reset --hard side &&\n+\tEDITOR=true git rebase --no-verify -i master &&\n+\ttest \"z$(git symbolic-ref HEAD)\" = zrefs/heads/test &&\n+\ttest \"z$(cat git)\" = zworld\n+'\n+\n test_done\n-- \n1.6.0.2\n\n-- \nNanako Shiraishi\nhttp://ivory.ap.teacup.com/nanako3/\n"},{"id":"92411","messageId":"20081006143028.GC7684@spearce.org","threadId":"15761","inReplyTo":"20081006141429.6117@nanako3.lavabit.com","subject":"Re: [PATCH] rebase --no-verify","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-10-06T14:30:28Z","receivedAt":"2008-10-06T14:30:28Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Nanako Shiraishi <nanako3@lavabit.com> wrote:\n> It is sometimes desirable to disable the safety net of pre-rebase hook\n> when the user knows what he is doing (for example, when the original\n> changes on the branch have not been shown to the public yet).\n> \n> This teaches --no-verify option to git-rebase, which is similar to the way\n> pre-commit hook is bypassed by git-commit.\n\nLooks good.\n \n>     It probably is better to fix \"rebase -i\" to share more code with the main\n>     \"rebase\" script to avoid duplicated run-pre-rebase-hook function, but it\n>     is beyond what I can do right now.  Perhaps people more smart and\n>     beautiful than me can help (^_^;)\n\nTrue.  But its already a mess.  git-sequencer is probably the\nright approach to merge it all together.\n \n>  git-rebase--interactive.sh |   10 +++++++++-\n>  git-rebase.sh              |    7 ++++++-\n>  t/t3409-rebase-hook.sh     |   16 ++++++++++++++++\n>  3 files changed, 31 insertions(+), 2 deletions(-)\n\nDocs?\n\n-- \nShawn.\n"},{"id":"92423","messageId":"20081006160716.GC14479@leksak.fem-net","threadId":"15761","inReplyTo":"20081006143028.GC7684@spearce.org","subject":"Re: [PATCH] rebase --no-verify","fromName":"Stephan Beyer","fromEmail":"s-beyer@gmx.net","sentAt":"2008-10-06T16:07:16Z","receivedAt":"2008-10-06T16:07:16Z","isPatch":true,"sender":{"key":"s-beyer@gmx.net","avatar":"https://avatars.githubusercontent.com/u/143889?v=4"},"body":"Hi,\n\nShawn O. Pearce wrote:\n> >     It probably is better to fix \"rebase -i\" to share more code with the main\n> >     \"rebase\" script to avoid duplicated run-pre-rebase-hook function, but it\n> >     is beyond what I can do right now.  Perhaps people more smart and\n> >     beautiful than me can help (^_^;)\n> \n> True.  But its already a mess.  git-sequencer is probably the\n> right approach to merge it all together.\n\nHmm, I don't think I like the pre-rebase hook in sequencer. The user\nscripts (git-rebase--interactive.sh and git-rebase.sh) should run them;\nthat's ok.\n\nI think, for the moment it is ok to have the code duplicated.  After\nsequencer has merged into master[1], I will probably take a look at\nmerging git-rebase.sh and git-rebase--interactive.sh if somebody\nelse is interested in it and if there is a good way to achieve that.\n\nRegards,\n  Stephan\n\nFootnotes:\n 1. For the *very* interested ones of you,\n \thttp://repo.or.cz/w/git/sbeyer.git\n    is the way to go. seq-builtin-dev is the active development branch\n    and git's master is frequently merged into it. seq-builtin-rfc^ is\n    an approach to possible patchsets (for review).\n\n-- \nStephan Beyer <s-beyer@gmx.net>, PGP 0x6EDDD207FCC5040F\n"},{"id":"92425","messageId":"20081006161424.GE8203@spearce.org","threadId":"15761","inReplyTo":"20081006160716.GC14479@leksak.fem-net","subject":"Re: [PATCH] rebase --no-verify","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-10-06T16:14:24Z","receivedAt":"2008-10-06T16:14:24Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Stephan Beyer <s-beyer@gmx.net> wrote:\n> Shawn O. Pearce wrote:\n> > >     It probably is better to fix \"rebase -i\" to share more code with the main\n> > >     \"rebase\" script to avoid duplicated run-pre-rebase-hook function, but it\n> > >     is beyond what I can do right now.  Perhaps people more smart and\n> > >     beautiful than me can help (^_^;)\n> > \n> > True.  But its already a mess.  git-sequencer is probably the\n> > right approach to merge it all together.\n> \n> Hmm, I don't think I like the pre-rebase hook in sequencer. The user\n> scripts (git-rebase--interactive.sh and git-rebase.sh) should run them;\n> that's ok.\n\nSorry, my remark wasn't about the rebase hook as much as it was\nthat there is a good chunk of code duplicated between the two\nrebase implementations and all of them were implemented through\ngit-sequencer its likely they could all collapse into a single\ncommon \"git rebase\" wrapper script which just sets up the call\nto git-sequencer.\n\nSo yea, I do agree, the pre-rebase hook should be in rebase, not\ngit-sequencer, but git-sequencer probably offers a great way to\nget the different rebase implementations combined together.\n \n> I think, for the moment it is ok to have the code duplicated.  After\n> sequencer has merged into master[1], I will probably take a look at\n> merging git-rebase.sh and git-rebase--interactive.sh if somebody\n> else is interested in it and if there is a good way to achieve that.\n\nYup, exactly my thoughts.  I just didn't express them well.\n\n-- \nShawn.\n"}]}