Hen*_*ing 7 git interactive rebase
我需要自动化交互式rebase或用其他命令替换它.让我解释一下我目前的情况:
在svn-> git转换中,我需要重新绑定新创建的git存储库以修复SVN期间的"历史截止".这是我的手动工作流程来解决问题.
branchNEW: containing history from SOMEDAY until now
branchOLD: containing history from past to SOMEDAY
Run Code Online (Sandbox Code Playgroud)
编辑或ascii:
branchNEW: Y - Z
branchOLD: W - X
Run Code Online (Sandbox Code Playgroud)
两个分支都没有共同的提交.
现在的基本想法是将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)
Run Code Online (Sandbox Code Playgroud)
在rebase之后,HEAD现在包含X和Y的文件.我还尝试向branchOLD添加新的提交,删除旧文件.在rebase SVN-HEAD和git-HEAD二进制相同之后,"git log --follow"不起作用.
现在主要问题是:我能够通过使用第二个交互式rebase来解决这个问题:
git rebase -i SHA
Run Code Online (Sandbox Code Playgroud)
SHA是branchNEW中旧的 root提交的sha-id .现在在编辑器中,我必须将"选择"更改为"编辑"以进行最顶层的提交.退出编辑器后,我现在必须删除错误的文件
git rm -f fileA fileB
git commit --amend
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
在此之后,git的HEAD与SVN的头部二进制相同,此外,git具有完整的历史记录,并且"git log --follow"也适用于移动的文件.
由于此步骤仅是未来巨大的VCS转换的一小部分,我需要编写完整的流程脚本.但是如何自动完成上述步骤呢?
(我知道SHA不会保持不变,但是我能够从每个提交消息中嵌入的svn-id获得所需的SHA)
我找到了可能的解决方案:
git rebase --interactive将“ rebase提交列表”(您可以在其中进行选择,存储,编辑等的列表)发送给编辑器。可以配置哪种编辑器。因此,解决方案是仅为此交互基础配置一个替代的“编辑器”。这可以使用环境变量GIT_SEQUENCE_EDITOR来完成:
GIT_SEQUENCE_EDITOR="command" git rebase -i SHA
Run Code Online (Sandbox Code Playgroud)
命令可以是一个shell脚本或一个简单的sed:
GIT_SEQUENCE_EDITOR="sed -i 's/^pick ce5efdb /edit ce5efdb /;/^pick ce6efdb /d'" git rebase -i SHA
Run Code Online (Sandbox Code Playgroud)
要点:“ rebase提交列表”作为文件传递到命令。因此,该命令必须接受文件名作为参数,并且必须将结果写入同一文件。“ sed -i”正是这样做的。