我目前有一个本地Git存储库,我将其推送到Github存储库。

本地存储库有约10个提交,Github存储库是这一点的同步副本。

我想做的是从本地Git存储库中删除所有版本历史记录,这样存储库的当前内容将显示为唯一的提交(因此不会存储存储库中的旧版本文件)。

然后我想将这些更改推送到Github。

我已经研究过Git的rebase,但这似乎更适合删除特定版本。另一个可能的解决方案是删除本地回购,并创建一个新的回购-尽管这可能会产生大量工作!

ETA:有些特定的目录/文件未被跟踪-如果可能的话,我想保持这些文件的未跟踪。


当前回答

gitfilter分支是主要的手术工具。

git filter-branch --parent-filter true -- @^!

--父过滤器获取stdin上的父对象,并应在stdout上打印重写的父对象;unix true成功退出,但不打印任何内容,因此:没有父级。@^!Git是“头部提交,而不是其任何父级”的简写。然后删除所有其他参考并在空闲时推送。

其他回答

这将删除主分支上的历史记录(您可能需要在运行命令之前进行备份):

git branch tmp_branch $(echo "commit message" | git commit-tree HEAD^{tree})
git checkout tmp_branch
git branch -D master
git branch -m master
git push -f --set-upstream origin master

这是基于@dan_waterworth的回答。

gitfilter分支是主要的手术工具。

git filter-branch --parent-filter true -- @^!

--父过滤器获取stdin上的父对象,并应在stdout上打印重写的父对象;unix true成功退出,但不打印任何内容,因此:没有父级。@^!Git是“头部提交,而不是其任何父级”的简写。然后删除所有其他参考并在空闲时推送。

我通过从项目中删除.git文件夹并通过IntelliJ重新集成版本控制解决了类似的问题。注意:.git文件夹是隐藏的。您可以使用ls-a在终端中查看它,然后使用rm-rf.git删除它。

我想做的是从本地Git存储库中删除所有版本历史记录,这样存储库的当前内容将显示为唯一的提交(因此不会存储存储库中的旧版本文件)。

更具概念性的答案:

如果没有标记/分支/refs指向旧提交,git会自动垃圾收集旧提交。因此,您只需删除所有标记/分支,并创建一个新的孤立提交,与任何分支关联——按照惯例,您可以让分支主节点指向该提交。

除非使用低级git命令进行挖掘,否则任何人都不会再看到旧的、无法访问的提交。如果这对你来说足够了,我就停下来,让自动GC在它想做的时候做它的工作。如果你想马上摆脱它们,你可以使用gitgc(可能带有--aggressive--prune=all)。对于远程git存储库,除非您具有对其文件系统的shell访问权限,否则无法强制执行此操作。

只需删除Github repo并创建一个新的。迄今为止是最快、最简单和最安全的方法。毕竟,当您只需要一个提交的主分支时,在接受的解决方案中执行所有这些命令,您可以获得什么?