如何压缩分支中的提交

WorksOnMyBox

我正在将旧的svn存储库导入git。某个时刻,所有分支中的文件夹都被重命名。这是通过在svn中创建具有历史记录的副本,然后在第二次提交时删除原始副本来完成的。因此,我有一个如下所示的仓库:

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

D / E和2/3是我要压缩的提交。压榨的原因是,尽管svn知道“与历史记录重复”,但git不会将其视为重命名,因为直到下一次提交才删除原始文件,这时我不得不责备历史记录。

我已经尝试了一些可以工作的rebase脚本,但是它们也使我的所有分支扁平化。上面是我必须做的一个认真简化的版本,这就是为什么我真的需要脚本的原因,因为我无法手动完成它。在SVN回购的整个历史中,有1000多个分支,并且可能有十多个并行分支在同一时间完成了更改。

git repo尚未发布,因此保持哈希值无关紧要。我假设我需要使用一些过滤分支脚本,但是我仍在尝试找出如何管理的方法,这就是我希望可以在这里获得帮助的方法。可以提供需要压缩的每个提交的sha1及其父对象。

达尔比克

您想使用git filter-branchusing--parent-filter来将任何外观D的SHA替换为CSHA。您也可以查看.git/info/graftsgit replace,这可能比编写a更简单,--parent-filter并且可以使用使其永久化filter-branch

更新:正如@torek所说,您绝对应该使用git replace要使用一个真实的例子,这是从readme.md重命名的README.md执行,中间是重命名为README1.mdhttps : //github.com/dahlbyk/posh-git/compare/dahlbyk : 2b9342c... dahlbyk : 57394c5让我们叫2b9342cC57394c5E

$ 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~)和其祖父母(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 ...

最后,afilter-branch将使更改永久生效:

$ 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

更新2

我收到的提交消息来自E,我不在乎。我希望有D的提交消息(或提供的脚本消息)。

要保持D的承诺元,我建议重新开始,并使用--commit-filter指定Etreegit cat-file -p E)的D(这E应该是跳过),如

git filter-branch --commit-filter '
  if [ "$GIT_COMMIT" = "SHA of D" ];
  then
    git commit-tree "TREE of E" -p "SHA of C";
  elif [ "$GIT_COMMIT" = "SHA of E" ];
  then
    skip_commit "$@";
  else
    git commit-tree "$@";
  fi;
  ' -- ^A E G

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为分支中的所有提交生成补丁?

Git:如何压缩分支上的所有提交

推送后如何压缩git中的提交?

如何在不跟踪远程分支的情况下压缩提交?

如何合并并提交到TeamCity中的分支

如何从合并分支分支的地方获得提交

这些git提交如何复制到错误的分支中?

压缩原始分支中的提交后如何重新设置基础?

如何使从提交到合并的分支成为分支?

如何从已删除的分支中永久删除提交?

如何压缩一个分支中的提交?

如何在VSTS Rest API中获取提交的分支名称?

如何为合并分支中的Git提交更新作者?

在git中,如何从分支中删除提交,但又将该提交保留在单独的分支中?

如何从git中的较旧提交修复我的master分支

Git:如何从主分支中删除一个提交

如何找到提交的分支?

如何压缩本地分支上的特定提交?

如何保留分支中您不想提交的更改

如何压缩git分支?

如何将压缩的提交视为分支?

如何在git中压缩提交?

当不是最近的提交时如何压缩提交

如何从已删除的未合并分支中删除提交?

如何返回分离分支中的提交

将压缩的提交从主分支合并到功能分支时避免 git 中的冲突

如何将多个提交合并到另一个分支作为单个压缩提交?

我如何 git cherry-pick 从分支 A 到分支 B 的提交,但我在分支 master 中?

原始分支合并到主分支后,如何从我的新分支中删除原始分支的提交?