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

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

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

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

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

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


当前回答

另一个选项是交互式rebase(假设您的git版本是>=1.7.12):gitrebase--root-i

当在编辑器中显示提交列表时:

将第一次提交的“pick”更改为“reword”每隔一次提交将“pick”更改为“fixup”

保存并关闭。Git将开始重新定基。

最后,您将有一个新的根提交,它是其后所有提交的组合。

这样做的好处是,您不必删除存储库,如果您有第二个想法,您总是有退路。

如果你真的想破坏你的历史记录,请将master重置为这个提交并删除所有其他分支。

其他回答

以下是清除Github存储库历史的步骤

首先,从.git中删除历史记录

rm -rf .git

现在,仅从当前内容重新创建git repo

git init
git add .
git commit -m "Initial commit"

推送到Github远程repo,确保您覆盖历史记录


git remote add origin git@github.com:<YOUR ACCOUNT>/<YOUR REPOS>.git
git push -u --force origin master

以下是根据@Zeelot的回答改编的脚本。它应该从所有分支中删除历史记录,而不仅仅是主分支:

for BR in $(git branch); do   
  git checkout $BR
  git checkout --orphan ${BR}_temp
  git commit -m "Initial commit"
  git branch -D $BR
  git branch -m $BR
done;
git gc --aggressive --prune=all

它符合我的目的(我没有使用子模块)。

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

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

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

您可以使用浅层克隆(git>1.9):

git clone --depth depth remote-url

进一步阅读:http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

这是暴力方法。它还删除了存储库的配置。

注意:如果存储库具有子模块,则此操作无效!如果您使用子模块,则应使用例如交互式rebase

步骤1:删除所有历史记录(确保您有备份,这无法恢复)

cat .git/config  # save your <github-uri> somewhere
rm -rf .git

步骤2:仅使用当前内容重建Git repo

在步骤2之前,如果您尚未设置init.defaultBranch配置,请通过git-config--globalinit.defaultBranch<branch-name>进行设置。在当前示例中,您可以选择main作为<branchname>

git init
git add .
git commit -m "Initial commit"

第三步:推送到GitHub。

git remote add origin <github-uri>
git push -u --force origin main