gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:12:12 28 4
gpt4 key购买 nike

我需要自动执行交互式 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 rebase 到 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 添加一个新的提交,它删除了旧文件。 rebase 后 SVN-HEAD 和 git-HEAD 二进制相同,但“git log --follow”不起作用。

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

git rebase -i SHA

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

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

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

由于这一步只是 future 巨大的 VCS 转换的一小部分,我需要编写完整过程的脚本。 但是如何将上述步骤自动化呢?

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

最佳答案

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

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

GIT_SEQUENCE_EDITOR="command" git rebase -i SHA

command 可以是一个 shell 脚本或者只是一个简单的 sed:

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

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

关于git:如何通过等效的 git 命令自动化交互式 rebase /替换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938711/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com