Git checkout / pull不会删除目录?

时间:2009-09-30 16:11:29

标签: git git-clean

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

我发布了以下内容:

git remote update
git checkout HEAD
git pull origin HEAD

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

两个问题:

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

5 个答案:

答案 0 :(得分:144)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

解决方案(拉出/快进/合并后):

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

如果您在stash之前没有clean,则会松开所有未跟踪的文件(不可逆转地)。

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

答案 3 :(得分:0)

在构建服务(CI)上,我遇到了同样的问题。由于GIT在不清理文件夹的情况下提取了所有文件,因此以前由CI生成的所有bin / obj都是脏的,因此如果我删除测试项目,则该垃圾桶仍将包含DLL,并会提及不存在的测试。

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

git clean -fd -x

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

  

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

答案 4 :(得分:-1)

Git目前不跟踪目录(参见git wiki),,即你既不能添加空目录,也不会删除最终为空的目录。 (编辑: 谢谢,Manni,我错了!你不能添加空目录,但是git将删除目录,因为他们的被跟踪内容被删除了。强>)

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

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

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

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

相关问题