如何在Github中删除所有提交记录?

602

我希望删除所有的提交历史记录,但保留代码在其当前状态,因为我的提交历史记录中有太多未使用的提交。

我该如何做到这一点?

是否有任何git命令可以实现这个目的?

git filter-branch ?
git rebase ?
... 

我的代码托管在 github.com 上。


2
  1. 删除父目录以及可能有单独的 .git/.gitignore 文件的子目录中的所有 .git 文件和 .gitignore 文件。为此,请运行:rm -rf .*git 命令,它将删除任何以 .git 结尾的文件。 2) 返回到父目录并运行 git init 命令,它将通过创建一个新的空白 .git 文件而初始化 .git 文件,不包含历史记录。 3) 运行 git add .git add * 命令。 4) 运行 git commit --all -m "initial commit" 命令。 5) 运行 git --set-upstream origin <git-url> 命令。 6) 运行 $ git push --mirror <git-repository-path> 命令。这个过程将重新编写历史记录。
- surendrapanday
跟随该页面并且运行得非常好!https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository#using-filter-branch - Jugal Panchal
2个回答

1966

删除 .git 文件夹可能会导致 git 仓库出现问题。如果你想要删除所有提交历史记录,但保持代码的当前状态,可以按照以下步骤操作:

  1. 检出

    git checkout --orphan latest_branch

  2. 添加所有文件

    git add -A

  3. 提交更改

    git commit -am "commit message"

  4. 删除分支

    git branch -D main

  5. 将当前分支重命名为 main

    git branch -m main

  6. 最后,强制更新你的仓库

    git push -f origin main

注意:这将不保留旧的提交历史记录。


29
确实很棒。 :) 0. 克隆:git clone https://github.com/blahblah/blahblah :) - Konstantinos
18
在执行完这些指令后,像这样运行一条命令:git gc --aggressive --prune=all,对于优化存储空间可能会有帮助。删除仓库也是如此。 - Tuncay Göncüoğlu
8
为什么要使用add -A?当我使用checkout --orphan时,所有文件都已经被暂存了;那么使用add -A难道不会添加本应保持未跟踪状态的文件吗? - unhammer
11
请注意,如果黑客获取了 GitHub 页面的 URL(https://github.com/<repo>/blob/<hash>),那么这种方法将无法删除该链接。唯有完全删除并重新创建存储库才能彻底消除风险。 - user1655072
12
这并不会删除提交记录。它只是让这些提交记录变成孤儿节点,并且回答了问题,清理了历史记录。但是,这些提交记录仍然存在,只是没有指向它们的东西。一些底层命令或特定的日志命令可以找到它们,你甚至可以恢复主分支。使用 git-prune 命令来修剪孤儿提交记录。我从未使用过它,所以不知道确切的命令,也不知道如何从远程中删除这些孤儿提交记录。 - RWDJ
显示剩余25条评论

164
如果你确认要删除所有提交历史记录,只需删除项目根目录下的.git文件夹(注意它是隐藏的)。然后在同一文件夹中初始化一个新的存储库,并将其链接到GitHub存储库:
git init
git remote add origin git@github.com:user/repo

现在提交你当前的代码版本

git add *
git commit -am 'message'

最后强制更新到 GitHub:

git push -f origin master

然而,在执行这些步骤之前,我建议备份历史记录(即存储库中的.git文件夹)!


7
但如果我只想保留最新的10个提交记录呢? - Chinaxing
1
这个可以工作,但是它会保留树上之前提交的历史记录,就像@Desta Haileselassie Hagos所说的那样。 - Julio Marins
2
@JulioMarins:我刚试了一下并推送到GitHub。 没有保留历史记录 - 只有一个提交 - Dan Dascalescu
17
在新推送的主分支中只有一个提交记录是非常具有误导性的,尽管历史记录仍将存在,但无法从该分支访问。例如,如果您有标签指向旧的提交记录,则可以访问这些提交记录。事实上,对于任何具备一定 Git 技能的人来说,在此“git push”之后,他们仍然可以从 GitHub 存储库中恢复所有历史记录 - 如果您有其他分支或标签,则甚至不需要太多的 Git 技能。 - Robert Muil
1
@TomášZato 您是在谈论 .git/config 中的上游设置吗?如果是,请先保存您的 .git/config,然后再恢复它。 - Danny Bullis
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接