如何在分支机构中压缩提交

时间:2017-02-22 18:08:46

标签: git svn git-filter-branch squash

我正在将旧的svn repo导入git。有一次,在所有分支中重命名了一个文件夹。这是通过创建带有历史记录的副本在svn中完成的,然后在第二次提交时删除原始文件。所以我有一个看起来像这样的回购:

A -> B -> C -> D* -> E* -> F -> G -> H
      \-> 1 -> 2* -> 3* - > 4 -/

D / E和2/3是我要压缩的提交。 压缩的原因是,虽然svn知道"重复历史记录",但git并没有将其视为重命名,因为原始文件在下次提交之前未被删除,我输了在这一点上责备历史。

我已尝试过一些可行的rebase脚本,但它们也会使我的所有分支都变得扁平化。以上是我必须要做的一个非常简化的版本,这就是为什么我真的需要脚本,因为我无法手动完成。在整个SVN回购历史中有超过1,000个分支机构,可能还有十几个并行分支机构,这些分支机构已完成此项更改(所有这些都在同一时间)。

git repo还没有发布,所以保持哈希是无关紧要的。我假设我需要使用一些过滤器分支脚本,但我仍然试图弄清楚如何管理我希望我可以在这里得到帮助。我可以提供需要压缩的每个提交的sha1及其父级。

1 个答案:

答案 0 :(得分:2)

您希望使用for(xwingwaves = 0 ; xwingwaves < xwingwc ; xwingwaves += 1) { if(alarm[3] <= -1) alarm[3] = 500; } 使用git filter-branch--parent-filter的SHA的任何外观替换为D的SHA。您还可以查看Cgit replace,这可能比编写.git/info/grafts更简单,并且可以使用--parent-filter永久保留。

更新:正如@torek所说,你绝对应该使用git replace。要使用现实生活中的示例,请执行从filter-branchreadme.md的重命名,并将中间重命名为README.mdhttps://github.com/dahlbyk/posh-git/compare/dahlbyk:2b9342c...dahlbyk:57394c5。让我们致电README1.md 2b9342cC 57394c5

E

假设中间移动从未发生过,我可以$ git tag E 57394c5 $ git tag C 2b9342c $ git tag G 450d8f1 $ git log --oneline --graph --decorate C~..G * 450d8f1 (tag: G) Merge pull request #320 ... |\ | * 941935c Fix a few kbd / missing markdown issues/ | * f13dcf9 Upcase readme and have more prompt examples. | * 57394c5 (tag: E) Now rename to README.md. | * eb79ef2 Prepare to upcase README.md filename. * | 536c57f Merge pull request #319 ... |\ \ | |/ |/| | * 7fafb7b Speed up Get-GitStatus |/ * 2b9342c (tag: C) Merge pull request #313 ... replace的父母(E)与其祖父母(E~ = {{1 }}):

E~2

最后,C会使更改永久化:

$ git log --stat --oneline C..E
57394c5 Now rename to README.md.
 README1.md => README.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
eb79ef2 Prepare to upcase README.md filename.
 readme.md => README1.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
$ git replace E~ C
$ git log --stat --oneline C..E
57394c5 Now rename to README.md.
 readme.md => README.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
eb79ef2 Merge pull request ...

出于您的目的,您将执行以下操作:

filter-branch

更新2

  

我得到的提交信息是E,我不在乎。我宁愿拥有D的提交消息(或脚本提供的消息)。

要保留$ git filter-branch -- ^C G E # For demo, only rewrite G & E afer C $ git log --graph --oneline --decorate C~..G * fcfd345 (tag: G) Merge pull request #320 ... |\ | * fa76267 Fix a few kbd / missing markdown issues/ | * 4900687 Upcase readme and have more prompt examples. | * b25aa5a (tag: E) Now rename to README.md. * | 536c57f Merge pull request #319 ... |\ \ | |/ |/| | * 7fafb7b Speed up Get-GitStatus |/ * 2b9342c (tag: C) Merge pull request #313 ... 的提交元数据,我建议您重新开始并使用$ git replace E~ E~2 $ git replace 3~ 3~2 $ git filter-branch -- ^A --all 指定D&#39; s --commit-filter({ {1}} {}为E(并且应该跳过tree),例如

git cat-file -p E