如何在git clean -fd命令中保留所有被忽略的文件?

40

当我有 .gitignore data/* 并运行 git clean -fd 时,data 文件夹及其所有内容文件都将被删除。

我想要的是在不删除 gitignored 文件的情况下删除 git 存储库中所有未纳入版本控制的文件。我该怎么办?


默认情况下,git clean 不应该 删除被忽略的文件。(您必须指定 -x 选项才能删除被忽略的路径。) - Amber
5
еҰӮжһңдҪ зҡ„.gitignoreж–Ү件дёӯеҢ…еҗ«data/иҖҢдёҚжҳҜdata/*пјҢдҪ дјҡйҒҮеҲ°зӣёеҗҢзҡ„й—®йўҳеҗ—пјҹ - VonC
@Amber 我之前也是这么想的。但似乎git clean不会删除被忽略的文件,但会删除被忽略的文件夹(以及它们的内容)。 - Danny Lin
2
foo/* 不会忽略 foo 文件夹 - 它只会忽略文件夹内的文件。这可能是为什么 git clean 会清除它的原因 - 因为它看到了一个名为 foo 的 "未被忽略的文件夹",因此将其删除(这恰好也会删除其所有内容)。 - Amber
3个回答

50

默认情况下,Git 不会清理被忽略的文件,除非指定了 -x 标志,但奇怪的是,在您进行配置时(folder/*),它会清理掉。

正如 @VonC 指出的那样,您应该更改 .gitignore 文件来忽略目录 (data/) 而不是其内容 (data/* )。

这是一个微妙的区别,但对 Git 很重要。


9
我同意我的评论 ;) +1 - VonC
4
有点烦人的是,如果你忽略了 folder/ 而不是 folder/*,那么你就不能像 !folder/foo 这样做出例外。目前在 Github 的标准 gitignore for Visual Studio 中存在这样的问题:https://github.com/github/gitignore/commit/9aa3e1c3a7a5d9a7ecbab67f63eb81e8b4a493b7#commitcomment-6092133 - Jamie Humphries
哇,这很烦人...看起来是Git clean中的一个bug? - Erfan
@Erfan,我不这么认为...你打算如何让它工作?如果你想要一个像!folder/foo这样的异常情况,那么这是否意味着你将跟踪foofolder两个文件夹?这样一来,无论如何都会保留它们,不受git clean -fd的影响。我在这里漏掉了什么吗? - Wildcard
1
@Wildcard 如果你想要一个像!folder/foo这样的例外,你需要先在gitignore中指定folder/*,否则你就无法首先添加这个例外。如果你运行git clean -fd,它会删除folder/foo,因为它既不被git跟踪,也不在gitignore中。请记住,只有folder的内容被忽略,而不是folder本身。但是,folder也不在Git中,因为它是一个空目录。所以当你运行git-clean时,它会清除文件夹(以及其中的内容),这样说起来有点混乱,我可能自己都有点糊涂了。 - Erfan
显示剩余5条评论

1
我找到了更多细节。在gitignore中有"/tmp/*",那么"git clean -fd"会将其删除。正如其他答案所说,这对于"/tmp/"不在gitignore中的情况不适用。
但是,一旦您在此目录中检入了任何文件,"git clean -fd"将忽略此路径。可以通过使用"git add -f"或将"!/tmp/.keep"添加到gitignore并检查此文件来实现这一点。

0

data/*更改为data/对我来说不可用,因为在那之后,您无法在排除的文件夹中列出白名单文件/文件夹。

当您将此放入.gitignore文件中时

data/
!data/foo.txt

文件foo.txt不会被包含。 要删除所有未被跟踪的文件(和文件夹),因为它们显示在git status中(并保留类似data/*在.gitignore中),您可以使用以下命令:
git ls-files -z -o --exclude-standard | xargs -0 rm -rf

这将列出所有未跟踪的文件并将它们传递给rm -rf函数,该函数将删除它们。

感谢https://dev59.com/LG865IYBdhLWcg3wduaH#3801554


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