如何完全清空Git仓库,而不删除它

39

我如何删除我存储在Git仓库中的所有文件和文件夹,但保留仓库?是否有某个命令可以重新启动Git仓库? 我找到了许多示例,但我搞得更糟了。该仓库已连接。如果有人愿意逐步向我解释,我将非常感激。


为什么要这样做呢?版本控制的整个目的就是跟踪更改,保持无效历史记录有什么意义呢?只需清除本地副本,创建一个新的副本,并将其远程设置为与当前副本相同,然后使用 git push -f 完全覆盖当前存储库历史记录即可,这似乎毫无用处。 - ThanksForAllTheFish
@ChrisMaes 嗯,对我来说,历史记录并不重要。这个仓库基本上是新的,所以我可以删除历史记录、文件和文件夹,但清除文件对我来说是首要任务... - nemo_87
@ChrisMaes 我收到了一个错误提示,内容是:更新被拒绝,因为远程仓库包含本地没有的工作。这通常是由于另一个仓库推送到相同的引用所致。在再次推送之前,您可能需要先集成远程更改(例如,“git pull…”)。 如果我不想拉取它,因为我想推送项目的新版本怎么办? P.S. 当我尝试将其推送到远程时发生了错误。 - nemo_87
@ChrisMaes 是的,我已经连接到代码仓库了。很抱歉在我的问题中没有提到这一点,我认为这不会影响你清除它的方式... 我马上就要编辑我的问题。 - nemo_87
你为什么不创建一个全新的代码库呢? - Sascha Wolf
显示剩余4条评论
3个回答

56

如果你只有一个本地的git仓库

如果你想要清除整个历史记录并重新开始:

cd <repo>
rm -rf .git
git init

并重新开始提交。

如果您想删除文件和历史记录:

cd <repo>
rm -rf *
git init

并开始添加文件并提交...

如果您已连接到远程存储库 如果您想重新开始,但并不介意保留一些旧历史记录,则有一种快速的方法:

git pull
git rm -r *
git commit
git push

现在你的代码库又变为空了,只剩下一些旧历史记录。如果你也想清除所有历史记录,那就需要更多的工作(请注意,这将对与同一远程代码库链接的其他人造成麻烦):

git checkout <first commit hash>
git rm -r *
touch README
git add README
git commit --amend
git push -f

请注意,我为第一次提交创建了一个空的README文件,因为提交不能为空。


或者,您可以通过使用“git checkout --orphan <branch_name>”创建第二个提交树。您的旧历史记录将保留,但不会被新历史记录所影响。 - Sascha Wolf
2
无法工作。每当我从分离的HEAD切换到主分支时,所有旧的东西都会回来。 - Craig Hicks
1
重置对我来说似乎更有效 - https://dev59.com/DmQn5IYBdhLWcg3w36bV#16500248 - Craig Hicks

7

谢谢您的回答 :) 当我尝试删除主分支(唯一的分支)时,我收到了以下错误信息:默认情况下,禁止删除当前分支,因为下一个“git clone”不会导致任何文件被检出,从而引起混乱。您可以在远程存储库中设置'receive.denyDeleteCurrent'配置变量为'warn'或'ignore',以允许删除当前分支,带有或不带有警告消息。要消除此消息,您可以将其设置为'refuse'。拒绝删除当前分支:refs/heads/master @VonC我不确定我是否正确理解了它... - nemo_87
@nemo_87 这只是一个本地仓库!?这就解释了你的错误信息。我会为其他需要清空(远程)仓库的人留下答案。 - VonC
对于本地的代码库,您不必按照第一个答案所建议的那样做。只需在任何地方运行git init即可开始使用:对于本地代码库,您的问题没有意义。 - VonC
在 Azure DevOps 中,当我在仓库中拥有有限的权限但没有删除整个仓库并重新创建新仓库的权限时,删除远程主分支是有效的。 - Jussi Palo
@JussiPalo 这确实是一个问题。我相当确定在2015年写这篇文章时没有想到Azure Devops及其权限(因为它当时还没有被命名为DevOps:https://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Azure_DevOps_Services)。 - VonC

1
  1. 重置提交或索引或工作树

    git reset --hard <commit>       # 重置提交、索引和工作树
    
  2. 删除引用日志

    git reflog expire --expire=all --all        # 清除引用日志
    
  3. 清理不必要的文件并优化本地仓库

    git gc --prune=now
    

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