Git clean可以删除空目录。

3

这是我所做的:


$ git status
# I see some files *and* directories (some tracked, some not) which I really wanted to discard
$ git clean -xd

我很惊讶地发现,git删除了一些其他目录,这些目录在git status中没有显示。经过最初的震惊(这是我在生产主机之一中的/etc),我意识到它们未被列在git中,因为它们是空目录(所以不是大问题,只需mkdir它们——希望获取正确的权限)。这很好,但是:
为什么git在执行git status时不考虑空目录,但在执行git clean时却考虑它们?这非常烦人(并且危险)!

Git只跟踪文件。如果你想跟踪一个文件夹,将一个.gitignore文件放在文件夹中是一种常见的方法。Git clean将仓库恢复到Git已知的状态(仅限文件)。 - undefined
紧密相关:https://dev59.com/QnVD5IYBdhLWcg3wBWzd - undefined
可能甚至是一个“隐藏”的重复项。 - undefined
如果你真的想看看git clean会删除什么,可以使用-n(或--dry-run)选项运行它。请参阅文档 - undefined
我并不是在问如何添加空目录(我已经知道了)。我只是在抱怨(并希望得到纠正),为什么git cleangit status在处理空目录方面不一致。 - undefined
1个回答

4

如您所知:在git中无法添加空目录(如果没有查看常见问题解答)。

git status实际上告诉您可以添加提交哪些更改。因此,即使git status可以显示空目录,这对用户来说也会非常令人困惑。

为什么我能看到这个目录但无法跟踪它?


git clean 另一方面会删除所有未被跟踪的内容。使用-d选项还告诉clean删除未被跟踪的目录
但是,什么定义了未被跟踪的目录
正如我们所学的那样,git不跟踪目录,它跟踪文件(或更具体地说是文件内容)。因此,一个未被跟踪的目录就是一个不包含任何已跟踪文件的目录。这适用于您忽略多个文件的build文件夹,也适用于您早些时候创建并忘记的空tmp文件夹。
如果您想确保git clean不会删除任何您想要保留的内容,您应该使用-n--dry-run)选项(在文档中有描述)。这将告诉您git clean将删除的所有文件。
为了确保您不会忘记使用-n--dry-run),您可以创建一个别名。
git config --global alias.status-clean "clean --dry-run"

你现在可以轻松地使用 git status-clean -dx 命令来显示所有将被 git clean -dx 命令删除的文件。

TL;DR: 不要使用git status来查看git clean -d将会删除什么。请使用git clean -d --dry-run


谢谢,但我还没有被说服。git status已经可以报告不可跟踪的文件(使用--ignored参数),因此有一个--all标识是合理的,git status只需为“空的不可跟踪目录”添加另一个部分即可。基本上,报告工具(git status)和执行工具(在这种情况下是git clean)使用了不同的文件/目录集合,这一点真的很不好。如果ls无法列出空目录而rm可以轻易删除它们,你肯定会不高兴的。幸运的是,有ls -a命令的形式来解决这个问题。 - undefined
我不喜欢使用一个用于写入文件系统的工具(git clean)来执行报告操作,仅仅是因为很容易犯错误并忘记加上 --dry-run 参数(你有没有曾经按下 ^R 来搜索你最后一条命令?)。用一个只读工具进行报告,用一个读写工具进行操作。但如果它们不一致的话... - undefined
我强烈不同意。你在比较两种完全不同的情况。git status --ignored 不会报告无法追踪的文件,它报告的是你明确选择不追踪的可追踪文件。一个空目录是无法追踪的。git status 是用于报告涉及文件追踪的一切操作(如 addcommitdiff 等)的工具;而另一方面,git clean 会删除你没有追踪的所有内容,无论是有意为之还是因为 git 无法追踪它。你期望错误的工具来完成这个任务。 - undefined
那么,git clean的对应报告工具是什么呢?我的意思是,一个只读的报告工具,如果我忘记了命令行标志,它不会造成严重后果。我的观点是应该使用git status - undefined
就像我之前说的,git status 是用来追踪(tracking)变化的,而 git clean 则是用来不追踪(not tracking)的。你可以很容易地创建一个别名 git config --global alias.status-clean "clean --dry-run" 并使用它。 - undefined

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