繁体   English   中英

git:如何自动化交互式变基/用等效的 git 命令替换它

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM