git clean -ndX不会删除目录。

6

使用.gitignore文件:

foo/

和一个Git仓库:

./quux
./quux/foo
./quux/foo/bar
./quux/foo/bar/baz

作为忽略项,git 认为工作目录是干净的:
% git status
# On branch master
nothing to commit, working directory clean
git clean -ndx 命令输出的内容如下:
% git clean -ndx
Would remove quux/

但是,git clean -ndX 没有打印任何内容。我希望它也能删除 quux/
这是一个错误还是我没有理解的一些 gitignore 特性?
如果我添加一些文件到 quux 并提交它,那么 git clean 将尝试删除 quux/foo/,就像预期的一样。
我的 git 版本相当新:git version 1.8.3.4

“./quux/foo/bar/baz” 是文件还是目录?你的代码库中还有其他文件吗? - michas
baz 是一个文件。没有其他文件。quux/ 目录外的文件不会以任何方式影响行为。 - phadej
1个回答

7
$ git init .
$ echo foo/ >.gitignore
$ git add .;git commit -am ignore
$ mkdir -p foo/bar bar/foo
$ touch foo/bar/1 bar/foo/1
$ git clean -ndx
Would remove bar/
Would remove foo/
$ git clean -ndX
Would remove foo/
$

git help clean的说明:

   -X
       Remove only files ignored by Git. This may be useful to rebuild
       everything from scratch, but keep manually created files.

这意味着它不会删除手动创建的内容,除非显式忽略。

在这种情况下,bar目录是手动创建的且未被显式忽略,因此它不会被删除。

quux目录也是如此。

要“修复”此问题,您需要通过添加文件将bar目录纳入git控制:

$ touch bar/x
$ git add bar/x
$ git commit -am add\ x
$ git clean -ndX
Would remove bar/foo/
Would remove foo/
$

那么,工作目录根目录下的 foo/ 被明确忽略,但是 bar/foo/ 只是被隐式忽略,因此不会被删除? 接下来的问题是:如何进行 git clean 操作以便删除隐式忽略的文件?这感觉有些不合逻辑,如果 bar/ 中有任何一个文件被 Git 跟踪,那么 bar/foo/ 将被删除。 - phadej
几乎了。bar是手动创建的,因此git不会触及其中任何内容。将bar添加到源代码控制后,该目录不再被视为手动操作,git将按照您的期望进行操作。 - michas
但是git status呢?它显示工作目录很干净,但实际上并不是。在我看来,git cleangit status之间的“干净”定义存在不匹配。 - phadej
Git 通常只关心文件,无法跟踪空目录。因此,git status 找不到任何新文件并报告为干净状态。git clean 然后会看到一个它不知道的目录(因为它里面没有被 Git 管理的文件),因此它会认为这个目录是手动创建的,所以不关心里面有什么。 - michas

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