在不执行 git rebase 的情况下更改提交的父级

Gil*_*mor 2 git

我需要通过删除旧的提交历史来缩小我长期存在的 GIT 存储库。

像这样转换……

A - B - D - E - ... 
 \ /         
  C 
    
Run Code Online (Sandbox Code Playgroud)

进入:

       D' - E - ...
Run Code Online (Sandbox Code Playgroud)

提交 E 后的提交历史相当复杂,包含很多分支、标签、合并等。

我不关心其他用户,因为这是一个尚未推送到任何远程存储库的迁移存储库。它是我本地机器上的一个裸仓库。如果需要,我可以将其转换为“正常”。

要创建 D' 并打印其哈希,我可以使用:

git commit-tree D^{tree}
Run Code Online (Sandbox Code Playgroud)

但问题是如何将提交 E 的父级从提交 D 切换到提交 D'?

在这个阶段,我已经找到的大部分技巧都建议在 D' 上做一个 rebase master 分支,但是当你有一个复杂的历史,有十多年的提交,有很多多个分支,标签,合并时,这并不容易等等。

当我 100% 确定新的父提交包含当前提交的所有内容时,是否有任何低级 GIT 命令可以简单地将指针切换到父提交而不执行 git rebase?

LeG*_*GEC 6

您可以使用git filter-repo项目页面):

文档摘录
父重写

将 $commit_A 替换为 $commit_B(例如,让所有以 $commit_A 作为父项的提交改为以 $commit_B 为父项),并重写历史记录以使其永久化:

git replace $commit_A $commit_B
git filter-repo --force
Run Code Online (Sandbox Code Playgroud)