git checkout / pull不会删除目录?


82

我有我的仓库@ github。我在家里做了一些工作,并将其推送到github。它涉及一些文件和目录的删除。现在,我在工作箱中,该工作箱在删除文件和目录之前具有代码的副本。

我发布了以下内容:

git remote update
git checkout HEAD
git pull origin HEAD

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

两个问题:

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

同意,git checkout HEAD不执行任何操作,因为HEAD是指向当前已检出提交的引用。在这两种情况下,您可能都想成为大师。
卡斯卡贝尔

好了,HEAD实际更新了所有内容,但删除了空目录。就像我说的,我是git的新手。
mculp

如何强制“ git pull”覆盖本地文件的可能重复项 如果您仍需要其他解决方案,请在此处查看答案。
DrBeco '17

Answers:


151

Git不会跟踪目录,因此不会删除由于合并或其他更改而变为空的目录。但是,您可以使用git clean -fd删除未跟踪目录(该-fd标记的装置˚F奥尔塞去除未跟踪文件和d irectories)。


4
我糊涂了。那么,为什么在我提交/推送更改时从我的GitHub存储库中删除了目录?
mculp

1
您的工作副本中的目录可能包含未跟踪的文件(包括隐藏的未跟踪文件),因此它们可能看起来是空的,但实际上不是,因此Git并未删除它们。git clean当然会。
mipadi

4
GitHub仓库是仓库(它们没有工作副本),而本地仓库却是仓库。我想如果您从GitHub来源克隆了一个新的存储库,那么您将没有这些目录。
mipadi

18
但是,当然,请使用-n(空运行)而不是-f首先运行命令,以便您可以看到要删除的内容。特别是因为不仅git clean -d删除那些麻烦的目录,而且删除了未跟踪的文件。
托德·欧文

2
@EliGolin:git clean除非您通过该-x选项,否则不会删除.gitignore中列出的文件。
mipadi

4

作为大多数更改工作树的操作(拉,合并,签出等)的一部分,git会删除该操作将其清空的任何目录(即git删除了最后一个文件)。

git不会删除所有不完全为空的目录,因此,如果您隐藏或忽略了文件,那么仅仅因为git从该目录中删除了最后一个跟踪的文件,并不一定意味着git将能够删除该目录。git认为这不是错误情况,因此不会对此有所抱怨。


我的GitHub存储库没有目录。当我提交时,它正确地删除了目录。但是,当我签出/拉出它只会删除文件。目录为空。$ ls -al总计8 drwxr-xr-x 2 mculp mculp 4096 Sep 23 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 Sep 30 10:51 ../
mculp

1
我不太确定您所说的“将HEAD转换为主机”是什么意思,我想您的意思是“ git checkout master”,但是大多数人只会说“我已切换至/签出主机”。无论如何,当git说“已经是最新的”时。这意味着它什么也没做。git只会删除使其为空的目录。
CB Bailey

措辞不好。正如某些人在评论中建议的那样,我将“ HEAD”更改为“ master”。
mculp

@CharlesBailey,你说的不是我看到的。git checkout没有删除一个完全空的目录。
Acumenus

@ABB:混帐仅删除那些目录被检出操作空。我已经再次测试了;它仍然有效。
CB Bailey

2

Git不会跟踪目录,文件(及其路径)。Git会创建这些路径中的所有目录,如果它们不存在,但(爽!),但它并不能删除它们,如果所有包含在路径中的文件被移动或删除(不冷静☹...但有原因)。

解决方案(一旦您拉出/快进/合并):

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

如果您stash以前不这样做clean,则将丢失所有未跟踪的文件(不可逆转)。

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


2

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

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

git clean -fd -x

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

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


-1

Git当前不跟踪目录(请参阅git wiki),也就是说,您既不能添加空目录,也不能git删除最终为空的目录。 (编辑:谢谢,曼妮,我错了!您不能添加空目录,但是git会删除由于其跟踪内容已删除而变为空的目录。

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

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

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

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


1
Wiki页面上说git不会为您创建空目录。它并没有说它不会删除空目录。mculp想要的对我有用。
innaM

@janko,实际上,git无法为我删除一个完全空的目录。
Acumenus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.