Git 如何";“轻松地”;修改父项以进行修订?

Git 如何";“轻松地”;修改父项以进行修订?,git,merge,git-svn,git-rewrite-history,Git,Merge,Git Svn,Git Rewrite History,我需要重写一些修订的历史,以便“黑客”一些与git svn同步的分支(我的意思是这里的修订…不想重写分支的整个历史)。如果我们去掉git svn细节,我所要做的基本上就是重新创建分支的一个部分的历史,重新定义修订的父级(只有父级被修改,没有其他) 因此,您可以更清楚地了解我打算做什么:我想从分支中删除一些修订,并将它们替换为我将手动创建的单个修订(使用提交树…我将使用从分支中删除的最新修订中的树)。然后,我将重新创建那些放在我删除的修订“顶部”的修订。考虑到我正在对历史进行修改,我可以“重写”孩

我需要重写一些修订的历史,以便“黑客”一些与git svn同步的分支(我的意思是这里的修订…不想重写分支的整个历史)。如果我们去掉git svn细节,我所要做的基本上就是重新创建分支的一个部分的历史,重新定义修订的父级(只有父级被修改,没有其他)

因此,您可以更清楚地了解我打算做什么:我想从分支中删除一些修订,并将它们替换为我将手动创建的单个修订(使用提交树…我将使用从分支中删除的最新修订中的树)。然后,我将重新创建那些放在我删除的修订“顶部”的修订。考虑到我正在对历史进行修改,我可以“重写”孩子的修改,修改他们的父母,以使用“重写”过程本身产生的新修改(把它想象成一个cherry pick或rebase操作……只是我不想做cherry pick或rebase,因为我已经有了原始修订版中的树,我正试图重写它们,对吧?)


看起来git提交树将是我可以用来完成这项工作的工具(我可以使用我想要重写的修订的树对象,然后我将设置修订的父项……好吧,数百个修订),但是消息、作者、提交者等细节并不是用提交树定义的那么简单(必须使用环境变量,消息可以从stdin读取)。如果不使用提交树,最简单的方法是什么?

继续回答我的原始问题。还记得第一个问题是什么吗?我想重写svn分支的历史记录(在本地更改。在svn repo上,分支不会被触及),这样我就可以创建一个“真正的合并”,而不是一系列与正在合并的分支无关的修订

我最终创建了一个基于git提交树的解决方案。我已经在githug上发布了它,以防有人试图实现同样的目标


干杯!

git replace
有一个
--edit
模式,它基本上是一个围绕着执行
git提交树的包装,然后当然是编写一个
refs/replace/
引用。这似乎是一个可行的方法。不可编写脚本,所以它不会成立(需要这样做数百次).现在我想知道我能做的是使用
git hash object
通过使用我想“重写”的对象“手动”创建对象吗"然后修改它的父项以匹配我需要的。啊,好吧,如果你想在脚本代码中这样做,
git sh setup
中有一段代码,
git filter branch
使用它将所有提交信息提取到magic env变量中。参见,例如,
get_author_ident_from_commit
和过滤器分支脚本,
set_ident
finish_ident
git filter branch
和grafts都是为此而设计的。git/info/grafts
中的每一行都是一个提交id,以及您希望本地git假设它拥有的父级id;git filter branch将结果烘焙到一个新的历史记录中。在四处寻找“最佳”之后方法可能有好几天,我最终应用了提交树方法