19

我有一个项目,其中包含对我自己的另一个项目的跟踪,我将其用作一种模板项目。现在我想从存储库中完全删除这些痕迹。基本上我想切断旧的垃圾提交。所以我有

A -- B -- C -- D -- E -- F

并想得到类似的东西

D -- E -- F

A -- B -- C从存储库中完全删除。

4

4 回答 4

32

假设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

如果您想完全删除旧的松散对象(AB、 & C),请首先确保您拥有您想要的东西。这不能被撤消。 一旦你确认这是你想要的,运行:

$ git reflog expire --expire=now --all
$ git gc --prune=now
于 2012-07-27T12:46:42.077 回答
3

Github 有一篇关于删除敏感数据的好文章(所以你也想要提交):

从 Git 中删除敏感数据

于 2012-07-27T12:42:51.470 回答
0

我知道这是一个老问题,但我今天来到这里搜索这个话题......

对于提交量大的问题,可以尝试在rebase命令中使用“-X theirs”或者“-X ours”,即

git rebase -X 他们的 -i HEAD~20

两者的区别在这里解释

我希望这对某人有用

于 2021-01-21T09:18:15.780 回答
0

试图遵循@vergenzt 的答案,但 git 开始从第一次提交中应用补丁,这是我需要开始之前的 3000 多次提交。

我的目的是为基于当前项目的新项目制作更小的 repo。不幸的是,我需要从当前项目(几个月)中保留一些历史记录。这就是我最终设法做到的方式:

命令行工具不太方便执行此操作,因为您需要解决冲突。幸运的是,在 TortoiseGit 中有一个 Rebase 功能,您需要提供 2 个 barnches:master(左)和 temp(右)。然后在您的临时分支包含提交之前跳过所有提交(选择提交并在右键菜单中使用“跳过”)。在 rebase 开始后,你会得到一些可以在 rebase GUI 中解决的冲突。我总是在右键菜单中选择“使用主分支版本”。与 CLI 相比,这花费的时间要少得多。一切完成后,我还从最新版本的原始存储库中复制了所有项目文件到新存储库中的文件(全部覆盖),以确保没有丢失。我只有几个在 .gitignore 中的文件,并且不知何故没有被忽略。

我希望这可以帮助别人。

于 2019-06-25T11:03:27.480 回答