2017-05-31 33 views
0

我需要重写一些修改的历史,以“黑客”的一些分支机构同步传送用git-svn的(我的意思是修订这里...不想改写分支机构的全部历史) 。如果我们拿出混帐svn的细节,我要做的就是基本上重新建立一个分支重新定义父母的一段历史上的修订(只有父母被修改,没有别的)。如何“轻松”修改父母的修改?

为了让您更清楚地了解我打算做的事情:我想删除许多分支的修订,并将用我将手动创建的单个修订(使用commit-tree)替换它们。 ..我将使用最新版本的树,我将从分支中删除)。然后,我将重新创建放在我删除的修订版的“顶部”的修订版。鉴于我正在取代历史上的修订版,我可以“修改”修改其父母的子修订版,以使用“重写”过程本身产生的新修订版(将它看作是樱桃选择或重新命名操作。 ....只是我不想做樱桃挑选或rebase,因为我已经从我原来修改过的树中尝试重写了,对不对?)。

它看起来像git 提交树将是我可以用来完成这项工作的工具(我可以使用修改的树对象我想重写,然后我会设置父母的修订......嗯,几百个修订)然而细节,如信息,作者,提交者并不那么简单与承诺树来定义(必须使用环境变量,可以从标准输入中读取消息)。如果不是使用commit-tree,最简单的方法是什么?

+0

'GIT中replace'具有'--edit'模式,基本上是围绕做'git的承诺-tree'的包装,随后当然由写'参/更换/'参考。这似乎是要走的路。 – torek

+0

不能脚本,所以它不会持有水(需要这样做数百次)。现在我想知道我能做什么是通过使用''''git hash-object'''来创建对象,通过使用我想要“重写”的对象,然后修改它的父项以匹配我需要的。 – eftshift0

+0

啊,好吧,如果你想在脚本代码中这样做,'git-sh-setup'中有'git filter-branch'用于将所有提交信息提取到魔术env变量中的代码。请参阅,例如'get_author_ident_from_commit'和过滤器分支脚本,'set_ident'和'finish_ident'。 – torek

回答

0

追问我原来的问题。还记得第一个是什么吗?我想重写一个SVN分支的历史(改本地。在svn的分支不会被触及),这样我可以创建一个没有关系的分支“真正合并”,而不是一系列的修订正在合并。

我结束了创建一个基于git的承诺树的解决方案。我已经将它发布在githug上,以防有人试图达到同样的效果。

https://github.com/eantoranz/git_svn_rewrite/blob/master/blend-git.txt

干杯!