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

git:如何用等效的git命令自动化交互式重新基址/替换它,git,interactive,rebase,Git,Interactive,Rebase,我需要自动化一个交互式重基,或者用其他命令替换它。让我解释一下我的现状: 在svn->git转换中,我需要重新设置新创建的git存储库的基础,以修复在svn过程中产生的“历史中断”。这是我的手动工作流程来解决这个问题 branchNEW: containing history from SOMEDAY until now branchOLD: containing history from past to SOMEDAY 编辑或作为ascii: branchNEW: Y - Z

我需要自动化一个交互式重基,或者用其他命令替换它。让我解释一下我的现状:

在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重新设置为Branchhold。不幸的是,有一天发生了一些重构:一些文件被移动到了另一个目录。现在,重基的结果是,每个移动的文件都存在于这两个位置

编辑

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

branchNEW: W - X - Y - Z
(after rebase)
在重新基化之后,HEAD现在包含X和Y的文件。我还尝试向branchhold添加一个新的commit,以删除旧文件。在rebase之后,SVN-HEAD和git-HEAD是二进制的,但是“git log--follow”不起作用

现在来看主要问题:我可以通过使用第二个交互式重基来解决这个问题:

git rebase -i SHA
SHA是branchNEW中旧根提交的SHA id。现在在编辑器中,我必须将最上面的提交的“pick”更改为“edit”。退出编辑器后,我现在必须删除错误的文件

git rm -f fileA fileB
git commit --amend
git rebase --continue
在此之后,git的头部是与SVN头部相同的二进制文件,此外,git具有完整的历史记录,并且“git log--follow”适用于移动的文件

由于这一步只是未来巨大的风投转型的一小部分,我需要为整个过程编写脚本但如何自动执行上述步骤?


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

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

git rebase——interactive将“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”正是这样做的。

也可能对您有所帮助。虽然这并不是您需要做的,但您应该能够使用类似的方法来自动化您的流程:

#!/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

我不确定,但是,
git filter branch
可能会对您有所帮助。我需要在存储库上自动压缩一些历史提交,以便创建一个脚本,该脚本将执行从svn迁移的所有必要操作,作为概念证明,其他项目成员可以以完全可复制的方式使用它来验证迁移是正确的。这太完美了。