如何完全清除Git工作目录?

3
在mercurial中,我习惯于使用hg up 00来完全清除工作目录。
这将重置工作目录到执行hg init后的状态。
git中有相应的命令吗?
请注意,hg up 00不同于hg up 0,它会更新到第一个提交的修订版本,而hg up null等效于hg up 00,只是打字少了几个字符。*8')
还要注意,我不想在git工作目录的根目录中只做一个rm -rf *,因为这样git status将显示所有文件都已被删除。我只想将存储库更新到第一次提交之前的状态。然而,我的搜索通过网络和git手册没有提供我需要在git中完成此操作的信息。
背景是,我想留下存储库,以便稍后轻松检出不同的提交。我之所以这样做的原因之一是,我有一个非常大的存储库(实际上是一个git svn存储库),我不想再次克隆它(这需要几天时间,并且你不应该克隆一个gitsvn存储库)。但是当我不需要它时,我希望能够释放掉占用的工作副本空间。

你不想删除 .git 目录吗? - Nylon Smile
这似乎是一件奇怪的事情。如果你想要重置到一个空白的仓库,为什么不直接创建一个空白的仓库呢?也许如果你解释一下为什么要这样做,你可能会得到一些类似于 Git 的建议。 - Abizern
@Nylon - 这将重置到 git init 之前的状态。OP想要回滚到 git init 后的状态。 - Abizern
3个回答

2

这似乎是一个不寻常的需求,因为git分支通常以非空的初始提交开始。使用通常的git命令无法“checkout”或“reset”到此初始提交之前。

您可以使用此命令将当前checkout分支重置为“未创建”状态,准备进行新的初始提交。

git updated-ref -d "$(git symbolic-ref HEAD)"

这将删除当前已检出的分支。

然后,您可以使用此命令从索引中删除所有文件(假设您在存储库的根目录)。

git rm -r --cached .

如果您有未提交的更改,可能需要使用-f开关。

最后,您可以使用此命令从工作树中清除所有文件。警告:潜在危险。

git clean -fd # WARNING, dangerous

谢谢Charles,但是我在测试仓库上尝试了一下,发现git status仍然显示所有文件都已被删除。我想我需要学习更多关于refs的知识。作为一个来自hg背景的人,我仍然觉得git有点文化冲击。 - Mark Booth
@MarkBooth:你运行了所有三个命令吗?最终,所有文件都应该从索引和工作树中被删除。这不是你想要的吗? - CB Bailey
再次感谢您,Charles。我第一次可能误用了命令,因为我刚刚尝试了一个新的测试存储库,似乎已经成功了。现在的问题是,我不知道如何将其恢复到给定的修订版本。我查看了git update-ref手册页面,但我还不了解引用的足够多,无法理解它。 - Mark Booth
@MarkBooth:你想回到哪个状态?我以为你想完全倒回到最初的提交之前?如果你想将分支重置回已知的提交,只需执行 git reset <commit-id> 即可。 - CB Bailey
好的,如果我执行 git init; touch a; git add .; git commit -ma; touch b; git add .; git commit -mb; git log 然后按照你的指示操作,我会得到一个干净的工作目录。如果我接着执行 git reset <commit-id of a>; git status,那么它会告诉我 a 已经被删除了。哦,我明白了,你需要执行 git reset --hard 来恢复文件。谢谢 - 我现在理解了。 - Mark Booth

2
在 git 中,空修订版的等价物被称为“裸仓库”。这个搜索提供了该主题的大致概述,不同将非裸仓库转换为裸仓库的方法可在此处找到。
与 hg 不同的是,没有简单的方法在裸仓库和非裸仓库之间切换。另外,在非裸仓库中不应推送,因为推送会更改 git 的索引,但不会更新工作树。有关详细信息,请参见使用两台笔记本电脑从 git 工作而无裸仓库

谢谢Rudi,这填补了我知识上的一个空白,让我能够找出适合我的解决方案。基本上,我需要使用git clone --bare -l gitsvn.partial gitsvn.partial.bare/.git来创建部分副本(然后可以使用rm -rf gitsvn.partial来回收空间),然后要取回它,我可以使用git clone -l gitsvn.partial.bare gitsvn.partial。第一个非常快,因为它使用硬链接,但是取回它将需要更长时间,因为它需要更新工作目录。即使如此,它仍然比重新克隆要快得多。 - Mark Booth

1

以下是我想到的解决方案:

1- 你可以从你的工作目录中删除.git目录,这样你的工作目录中就没有git仓库了。

2- 你可以通过执行以下命令将代码重置为初始提交(初始提交仍将保留):

git reset --hard `git rev-list HEAD | tail -n 1`

这通常很有用,但对于我目前考虑的巨大的git svn仓库并没有太大帮助。第一个提交已经部分地位于原始svn仓库中,因此已经相当大了。 - Mark Booth

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