[英]git: How to automate interactive rebase / replace it by equivalent git commands
我需要自动执行交互式变基或用其他命令替换它。 简单说一下我现在的情况:
在 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 上。 不幸的是,有一天发生了一些重构:一些文件被移动到另一个目录。 现在 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 添加一个新提交,以删除旧文件。 变基后 SVN-HEAD 和 git-HEAD 二进制相同,但“git log --follow”不起作用。
现在是主要问题:我可以通过使用第二个交互式 rebase 来解决这个问题:
git rebase -i SHA
SHA 是 branchNEW 中旧根提交的 sha-id。 现在在编辑器中,我必须将最顶层提交的“pick”更改为“edit”。 退出编辑器后,我现在必须删除错误的文件
git rm -f fileA fileB
git commit --amend
git rebase --continue
在此 git 的 HEAD 与 SVN 的 head 二进制相同之后,git 具有完整的历史记录,并且“git log --follow”也适用于移动的文件。
由于这一步只是未来巨大的 VCS 过渡的一小部分,我需要编写整个过程的脚本。 但是如何自动化上述步骤呢?
(我知道 SHA 不会保持不变,但我能够从嵌入在每个提交消息中的 svn-id 获取所需的 SHA)
我找到了一个可能的解决方案:
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”正是这样做的。
expect
也可以帮助你。 虽然这不是您需要做的,但您应该能够使用类似的东西来自动化您的流程:
#!/usr/bin/env expect
spawn git rebase -i HEAD~2
# change the second "pick" to "squash"
# jump to top (if not there), down, delete word, insert 's' (for squash), Escape, save and quit
send "ggjdwis \033:wq\r"
expect "# This is a"
# skip past first commit message (assumed to be one line), delete rest of file
# down 4, delete 3 lines, save and quit
send "4j3d:wq\r"
interact
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.