我有一个项目,其中包含了指向我自己另一个项目的痕迹,我将其作为模板项目使用。现在我想完全从存储库中删除这些痕迹。基本上我想剪掉旧的无用提交记录。因此,我有:
A -- B -- C -- D -- E -- F
并且希望得到类似的结果
D -- E -- F
从代码仓库完全删除了A -- B -- C
。
我有一个项目,其中包含了指向我自己另一个项目的痕迹,我将其作为模板项目使用。现在我想完全从存储库中删除这些痕迹。基本上我想剪掉旧的无用提交记录。因此,我有:
A -- B -- C -- D -- E -- F
并且希望得到类似的结果
D -- E -- F
从代码仓库完全删除了A -- B -- C
。
假设 master
所在的提交是 F
:
# create a new branch with D's content
$ git checkout --orphan temp <d-sha1>
$ git commit
# rebase everything else onto the temp branch
$ git rebase --onto temp <d-sha1> master
# clean up
$ git checkout master
$ git branch -d temp
如果您想完全删除旧的松散对象 (A
, B
, & C
),请确保您确实拥有所需的内容。这是不可逆转的。一旦您确认它是您想要的,运行:
$ git reflog expire --expire=now --all
$ git gc --prune=now
F
不再是相同的提交,因此如果他们尝试提交到F
并推送,它将无法正常工作。 - vergenztgit commit -C <d-sha1>
以重用“原始”提交 D 的提交消息、作者、日期等。 - akavel我试图按照@vergenzt的答案操作,但是git开始从第一个提交应用补丁,这比我需要从中开始的提交要多3000个以上。
我的目的是为基于当前项目的新项目创建较小的repo。不幸的是,我需要保留当前项目的一些历史记录(几个月)。这就是我最终成功的方法:
命令行工具不太方便做到这一点,因为您需要解决冲突。幸运的是,TortoiseGit中有一个Rebase功能,您需要提供两个分支:master(左)和temp(右)。然后跳过所有在您的temp分支之前的提交,包括提交(选择提交并在右键菜单中使用“跳过”)。重新启动rebase后,您将得到一些冲突,您可以直接在rebase GUI中解决这些冲突。我总是在右键菜单中选择“使用主分支版本”。这比麻烦的CLI花费了更少的时间。
完成所有操作后,我还额外复制了原始存储库的最新版本中的所有项目文件到新存储库中的文件(覆盖所有内容),以确保没有任何丢失。我只得到了几个未被忽略的.gitignore文件。其他文件都是相同的。
希望这能帮助到某些人。
我知道这是一个老问题,但今天我在搜索这个主题时来到了这里...
针对大量提交的问题,您可以尝试在rebase命令中使用“-X theirs”或“-X ours”,即
git rebase -X theirs -i HEAD~20
两者之间的区别在这里解释
希望对某人有用
git rebase -i
命令来移除第一个提交记录。 - vergenzt