我有我的回购@github。我在家里做了一些工作,并把它推到了 github 上。它涉及一些文件和目录的删除。现在我在我的工作箱上,在删除文件和目录之前有一份代码副本。
我发布了以下内容:
git remote update
git checkout HEAD
git pull origin HEAD
它删除了它应该拥有的所有文件,但没有删除文件所在的目录。
两个问题:
- 为什么它没有删除目录?
- 我可以在当前状态下发出 git 命令来删除它们吗?
Git 不跟踪目录,因此它不会删除由于合并或其他更改而变为空的目录。但是,您可以使用git clean -fd
删除未跟踪的目录(该-fd
标志表示强制删除未跟踪的文件和目录)。
我有同样的问题,在我的构建服务(CI)的情况下..由于GIT在没有清理文件夹的情况下提取所有文件,之前由CI构建的所有bin / obj都是脏的,所以如果我删除一个测试项目,bin仍将包含 DLL 并将提及不存在的测试。
为了解决这个问题;这个命令似乎可以解决问题(至少对我而言)
git clean -fd -x
其中 X 将删除所有未跟踪的文件:
-X 仅删除 Git 忽略的文件。这可能有助于从头开始重建所有内容,但保留手动创建的文件。
作为更改工作树的大多数操作(拉取、合并、签出等)的一部分,git 将删除由该操作变为空的所有目录(即 git 删除了最后一个文件)。
git 不会删除任何不完全为空的目录,因此如果您有隐藏或忽略的文件,那么仅仅因为 git 从该目录中删除了最后一个跟踪的文件并不一定意味着 git 将能够删除该目录。git 不认为这是一个错误条件,所以不会抱怨它。
Git 不跟踪目录、文件(及其路径)。如果这些路径尚不存在,Git 会为这些路径创建所有目录(酷!),但是如果路径中包含的所有文件都被移动或删除,它不会删除它们(不酷☹ ...但有原因)。
解决方案(一旦你拉/快进/合并):
git stash --include-untracked
git clean -fd
git stash pop
stash
如果您之前不这样做clean
,您将丢失所有未跟踪的文件(不可逆转地)。
注意:由于这也会清除所有被忽略的文件,因此您可能需要再次运行一些构建脚本来重新创建项目元数据(例如:)./gradlew eclipse
。这也会删除空的目录,并且这些目录从来都不是 git 文件路径的一部分。
Git 目前不跟踪目录(参见git wiki),也就是说,您既不能添加空目录,也不能 git remove 最终为空的目录。 (编辑:谢谢,Manni,我错了!你不能添加空目录,但是 git 会删除那些因为跟踪的内容被删除而变成空的目录。)
至于删除空目录的命令:这取决于您的操作系统。
对于 Linux,您可以使用,例如,
find -depth -type d -empty -exec rmdir {} \;
但是,这将删除所有空目录!