92

我有我的回购@github。我在家里做了一些工作,并把它推到了 github 上。它涉及一些文件和目录的删除。现在我在我的工作箱上,在删除文件和目录之前有一份代码副本。

我发布了以下内容:

git remote update
git checkout HEAD
git pull origin HEAD

它删除了它应该拥有的所有文件,但没有删除文件所在的目录。

两个问题:

  1. 为什么它没有删除目录?
  2. 我可以在当前状态下发出 git 命令来删除它们吗?
4

5 回答 5

166

Git 不跟踪目录,因此它不会删除由于合并或其他更改而变为空的目录。但是,您可以使用git clean -fd删除未跟踪的目录(该-fd标志表示强制删除未跟踪的文件和目录)。

于 2009-09-30T18:19:24.383 回答
5

我有同样的问题,在我的构建服务(CI)的情况下..由于GIT在没有清理文件夹的情况下提取所有文件,之前由CI构建的所有bin / obj都是脏的,所以如果我删除一个测试项目,bin仍将包含 DLL 并将提及不存在的测试。

为了解决这个问题;这个命令似乎可以解决问题(至少对我而言)

git clean -fd -x

其中 X 将删除所有未跟踪的文件:

-X 仅删除 Git 忽略的文件。这可能有助于从头开始重建所有内容,但保留手动创建的文件。

于 2019-10-20T04:27:27.977 回答
4

作为更改工作树的大多数操作(拉取、合并、签出等)的一部分,git 将删除由该操作变为空的所有目录(即 git 删除了最后一个文件)。

git 不会删除任何不完全为空的目录,因此如果您有隐藏或忽略的文件,那么仅仅因为 git 从该目录中删除了最后一个跟踪的文件并不一定意味着 git 将能够删除该目录。git 不认为这是一个错误条件,所以不会抱怨它。

于 2009-09-30T17:09:53.157 回答
2

Git 不跟踪目录、文件(及其路径)。如果这些路径尚不存在,Git 会为这些路径创建所有目录(酷!),但是如果路径中包含的所有文件都被移动或删除,它不会删除它们(不酷☹ ...但有原因)。

解决方案(一旦你拉/快进/合并):

git stash --include-untracked
git clean -fd
git stash pop

stash如果您之前不这样做clean,您将丢失所有未跟踪的文件(不可逆转地)。

注意:由于这也会清除所有被忽略的文件,因此您可能需要再次运行一些构建脚本来重新创建项目元数据(例如:)./gradlew eclipse。这也会删除空的目录,并且这些目录从来都不是 git 文件路径的一部分。

于 2015-06-22T21:46:41.107 回答
-1

Git 目前不跟踪目录(参见git wiki),也就是说,您既不能添加空目录,也不能 git remove 最终为空的目录。 (编辑:谢谢,Manni,我错了!你不能添加空目录,但是 git 会删除那些因为跟踪的内容被删除而变成空的目录。

至于删除空目录的命令:这取决于您的操作系统。

对于 Linux,您可以使用,例如,

find -depth -type d -empty -exec rmdir {} \;

但是,这将删除所有空目录!

于 2009-09-30T16:23:44.890 回答