我在 GitHub 上有一个代码库。我在家里做了一些工作并将其推送到 GitHub。它涉及删除一些文件和目录。现在我正在我的工作电脑上,这台电脑拥有在删除这些文件和目录之前的代码副本。
我执行了以下操作:
git remote update
git checkout HEAD
git pull origin HEAD
它删除了应该删除的所有文件,但没有删除文件所在的目录。
两个问题:
- 为什么它没有删除目录?
- 在当前状态下是否有可以使用的git命令来将它们删除?
我在 GitHub 上有一个代码库。我在家里做了一些工作并将其推送到 GitHub。它涉及删除一些文件和目录。现在我正在我的工作电脑上,这台电脑拥有在删除这些文件和目录之前的代码副本。
我执行了以下操作:
git remote update
git checkout HEAD
git pull origin HEAD
它删除了应该删除的所有文件,但没有删除文件所在的目录。
两个问题:
Git不跟踪目录,因此它不会删除由于合并或其他更改而变为空的目录。然而,您可以使用git clean -fd
来删除未跟踪的目录(-fd
标志意味着强制删除未跟踪的文件和目录)。
git clean
可以做到。 - mipadi-n
(干跑)而不是-f
,这样您就可以看到将要被删除的内容。特别是因为git clean -d
不仅会删除令人担忧的目录,还会删除未被跟踪的文件。 - Todd Owengit clean
命令不会删除 .gitignore 文件中列出的文件,除非你使用 -x
选项。 - mipadi我遇到了同样的问题,在我的构建服务(CI)上。因为GIT在不清理文件夹的情况下拉取所有文件,所以之前由CI构建的所有bin/obj都是脏的,因此如果我删除一个测试项目,bin仍将包含DLL并提到不存在的测试。
为了解决这个问题,这个命令似乎可以解决问题(至少对我来说是这样)。
git clean -fd -x
X会删除所有未跟踪的文件:
-X仅删除Git忽略的文件。这对于从头开始重建但保留手动创建的文件可能很有用。
-x
命令清除了我的日志,虽然我不希望它们出现在 Git 中(只是本地远程服务器上),但是由于它们经常变动,所以被 .gitignore
忽略了。 - Ricky Levi在大多数涉及更改工作目录的操作(如pull、merge、checkout等)中,Git会删除由该操作使得为空的任何目录(即Git删除了最后一个文件)。
如果您有隐藏或忽略的文件,那么仅仅因为Git从该目录中删除了最后一个已跟踪文件,并不意味着Git能够删除该目录,除非该目录完全为空。Git不认为这是错误条件,因此不会抱怨。
git checkout master
",但大多数人会直接说"我切换到了/检出了master分支"。无论如何,当git显示'Already up-to-date.'时,意味着它没有执行任何操作。git只会删除由它自己造成为空的目录。 - CB Baileygit checkout
并没有删除一个完全空的目录。 - AsclepiusGit不会跟踪目录和文件(包括它们的路径)。如果这些路径不存在,Git会为它们创建所有目录(很棒!),但是如果一个路径中的所有文件被移动或删除,Git并不会删除它们(很糟糕☹ ...但是有原因)。
解决方案(一旦您已经拉取/快进/合并):
git stash --include-untracked
git clean -fd
git stash pop
如果在执行clean
之前不进行stash
,你将会永久性地丢失所有未被跟踪的文件。
注意:由于此操作也会清除所有被忽略的文件,因此您可能需要重新运行一些构建脚本以重新创建项目元数据(例如:./gradlew eclipse
)。此操作还会删除那些空的目录,并且这些目录从未出现在git文件路径中。
-f
。git clean -f -f -d
Git目前不跟踪目录(请参阅git wiki),也就是说,您既不能添加空目录,也不会删除最终变为空的目录。
(修改: 谢谢Manni, 我错了! 你不能添加空目录,但当它们被删除时git将删除目录)至于删除空目录的命令:这取决于您的操作系统。
对于Linux,您可以使用例如:
find -depth -type d -empty -exec rmdir {} \;
然而,这将删除所有空目录!