git:如何通过等效的git命令自动化交互式rebase /替换它

时间:2014-09-19 16:43:40

标签: git interactive rebase

我需要自动化交互式rebase或用其他命令替换它。让我解释一下我目前的情况:

在svn-> git转换中,我需要重新绑定新创建的git存储库以修复SVN期间发生的“历史截止”。这是我的手动工作流程来解决问题。

branchNEW: containing history from SOMEDAY until now
branchOLD: containing history from past to SOMEDAY

编辑或ascii:

branchNEW:        Y - Z
branchOLD: W - X

两个分支都没有共同提交。

现在的基本想法是将branchNEW转换为branchOLD。不幸的是有一些重构SOMEDAY:一些文件被移动到另一个目录。现在,rebase的结果是,每个移动的文件都存在于两个地方。

编辑

some file exist in X 
the (nearly) same files also exist in Y, just on another path

branchNEW: W - X - Y - Z
(after rebase)

在rebase之后,HEAD现在包含X和Y的文件。我还尝试向branchOLD添加新的提交,删除旧文件。在rebase SVN-HEAD和git-HEAD二进制相同之后,“git log --follow”不起作用。

现在主要问题是:我能够通过使用第二个交互式rebase来解决这个问题:

git rebase -i SHA

SHA是branchNEW中根提交的sha-id。现在在编辑器中,我必须将“选择”更改为“编辑”以进行最顶层的提交。退出编辑后,我现在必须删除错误的文件

git rm -f fileA fileB
git commit --amend
git rebase --continue

此git的HEAD与SVN的头部二进制相同,此外,git具有完整的历史记录,并且“git log --follow”适用于移动的文件。

由于此步骤仅是未来巨大的VCS转换的一小部分,我需要编写完整的流程脚本。 但如何自动执行上述步骤?

(我知道SHA不会保持不变,但我能够从每个提交消息中嵌入的svn-id中获取所需的SHA)

2 个答案:

答案 0 :(得分:4)

我找到了一个可能的解决方案:

git rebase --interactive 将“rebase提交列表”(您可以选择,存储,编辑......的列表)发送给编辑器。可以配置哪种编辑器。所以解决方案是为这个交互式rebase配置一个替代的“编辑器”。这可以使用环境变量GIT_SEQUENCE_EDITOR:

来完成
GIT_SEQUENCE_EDITOR="command" git rebase -i SHA

命令可以是shell脚本,也可以只是一个简单的sed:

GIT_SEQUENCE_EDITOR="sed -i 's/^pick ce5efdb /edit ce5efdb /;/^pick ce6efdb /d'" git rebase -i SHA

重要说明:“rebase提交列表”作为文件传递给命令。因此命令必须接受文件名作为参数,并且必须将结果写入同一文件。 “sed -i”正是这样做的。

答案 1 :(得分:0)

expect也可以帮到你。虽然这不是你需要做的,但你应该可以使用类似的东西来自动化你的过程:

{{1}}