我该如何从当前的工作树中删除未被跟踪的本地文件?
git-clean - Remove untracked files from the working tree
Synopsis
git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…
Description
Cleans the working tree by recursively removing files that are not under version control, starting from the current directory.
Normally, only files unknown to Git are removed, but if the
-x
option is specified, ignored files are also removed. This can, for example, be useful to remove all build products.If any optional
<path>...
arguments are given, only those paths are affected.
第一步是使用-n
选项显示将被删除的内容:
# Print out the list of files and directories which will be removed (dry run)
git clean -n -d
清理步骤 - 注意:这将删除文件:
# Delete the files from the repository
git clean -f
git clean -f -d
或 git clean -fd
git clean -f -X
或 git clean -fX
git clean -f -x
或 git clean -fx
注意后两个命令中X
的大小写不同。
如果在您的配置中设置了clean.requireForce
为“true”(默认值),则需要指定-f
,否则实际上什么也不会发生。
有关更多信息,请参见git-clean
文档。
-f
,--force
如果 Git 配置变量 clean.requireForce 没有设置为 false,则 git clean 将拒绝运行,除非给出 -f
、-n
或 -i
。
-x
不使用从 .gitignore(每个目录)和 $GIT_DIR/info/exclude
读取的标准忽略规则,但仍然使用使用 -e
选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以与 git reset 结合使用,创建一个原始的工作目录来测试干净的构建。
-X
仅删除 Git 忽略的文件。这可能对于从头开始重建一切但保留手动创建的文件很有用。
-n
,--dry-run
不要实际删除任何内容,只是显示将要执行的操作。
-d
除了未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由另一个 Git 存储库管理,则默认情况下不会删除它。如果您真的想删除这样的目录,请两次使用 -f
选项。
git clean -f
只在被调用的目录及其子目录中生效。如果你想清理整个工作副本,应该在其根目录下调用该命令。 - Eduardo Bezerragit clean -f :/
的作用类似于在根仓库目录下运行它。还可以使用 git clean -ffxd :/
来考虑子模块。请参考后续答案。 - here使用git clean -n
命令可以查看将会被删除的文件,但不执行实际删除操作。
并不真正移除任何东西,只是显示将要执行的操作。
git clean -n
或者git clean --dry-run
除了未跟踪的文件外,还可以删除未跟踪的目录。如果未跟踪的目录由另一个Git存储库管理,则默认情况下不会将其删除。如果确实想要删除这样的目录,请两次使用-f
选项。
git clean -fd
你可以使用 git status
命令检查你的文件是否真的被删除了。git clean -n -d
进行干运行。 - Ms01git clean -nd
和 git clean -fd
的效果是相同的。 - Micer-n
或 --dry-run
并没有任何作用。根据 @Ms01 和 @Micer 的建议,您需要添加 -d
,例如 git clean -nd
来显示它将要删除的内容。 - joehanna我很惊讶之前没有人提到过这点:
git clean -i
这代表着交互式,你将会快速了解将要被删除的内容,并提供包括/排除受影响文件的可能性。总体而言,比在真正清理前运行强制的--dry-run
还要快。
如果你也想处理空文件夹,那么你需要加上-d
。最后,它能够成为一个很好的别名:
git iclean
话虽如此,交互式命令的额外辅助可能会让经验丰富的用户感到疲倦。最近,我只是使用已经提到的git clean -fd
命令。
git clean -i
只有在工作副本的根目录下调用才有效吗? - Alessandro Jacopson要删除所有未跟踪的文件,简单的方法是首先将它们全部添加,然后像下面这样重置仓库
git add --all
git reset --hard HEAD
git add .
来代替git add --all
。因此,你可以使用一行命令git add . && git reset --hard HEAD
来更简便地执行此操作(请注意,这个命令要非常小心)。 - alexandre-rousseaugit clean
命令会连同被忽略的文件一并删除,所以它刚刚删除了我的 node_modules
文件夹。如果要避免这种情况发生,可以先将所有非被忽略的文件加入暂存区,然后使用重置命令删除它们。被忽略的文件将不会受到影响。 - Andreasgit clean -n
(参见这里),或者使用git clean -i
(参见这里)。 - Qw3rygit clean
命令仅在使用 -x
或 -X
选项时才会删除被忽略的文件,否则它只会删除未被跟踪的文件。 - doubleDowngit add .
只会将当前目录及其子目录下的文件添加到暂存区,而 git add --all
会将整个仓库的文件都添加到暂存区。后者似乎是更安全的选择。 - TrueWill如果未被跟踪的目录是一个独立的 git 子仓库(例如,子模块),则需要使用两个 -f
:
git clean -d -f -f
cd
到 git rev-parse --show-toplevel
。 - Mark Kahn这是我经常使用的:
git clean -fdx
对于一个非常大的项目,您可能需要运行它几次。
我喜欢使用git stash push -u
,因为你可以使用git stash pop
撤销所有的操作。
编辑:我还发现了一种方法,可以在stash中显示未跟踪的文件(例如git show stash@{0}^3
)https://dev59.com/Q2cs5IYBdhLWcg3wp1pW#12681856
编辑2:git stash save
已经被废弃,推荐使用push
。谢谢@script-wolf提供的信息。
-u
相当于 --include-untracked
。您可以通过 git help stash
查找帮助。 - hiroshisave
选项已被弃用,push
取代了它并且具有相同的功能,但更多。您可以在此处阅读更多信息:https://dev59.com/NFcP5IYBdhLWcg3wP32t#44681952 - Script Wolf-n
运行clean命令之前,始终使用-n
,它会显示将被删除的文件列表。
-d
通常,如果未指定,则git clean不会递归进入未跟踪的目录以避免删除过多。 指定-d
可以使其递归到这些目录中。 如果指定了任何路径,则-d
无关紧要; 将删除与指定路径匹配的所有未跟踪文件(在--force下提到的嵌套git目录有例外)。
-f
|--force
如果Git配置变量clean.requireForce
未设置为false,则git clean将拒绝删除文件或目录,除非给出-f
或-i
。 Git将拒绝修改未跟踪的嵌套git存储库(具有.git子目录的目录),除非给出第二个-f
。
git clean -n -d
git clean -n -d -f
如果输出是您打算删除的内容,则现在可以不使用-n
运行。
git clean -d -f
默认情况下,git clean
仅会删除未被跟踪且未被忽略的文件。匹配你的 .gitignore 或其他忽略文件中模式的文件不会被删除。如果你想要同时删除这些文件,你可以在清理命令后添加 -x
。
git clean -f -d -x
清理命令还提供交互模式-i
。
git clean -x -i
git stash --all
使用 stash --all
前请注意:
如果使用了 --all
选项,则除了未跟踪的文件外,还会存储和清理被忽略的文件。
git stash push --keep-index
如果使用了--keep-index选项,则已添加到索引的所有更改都会保持不变。您暂存的更改仍然在你的工作区中,但同时也保存到了你的贮藏中。git stash
而没有任何参数等同于git stash push
。git stash push -m "name your stash" // before git stash save (deprecated)
根据使用的标记进行暂存可以通过将文件写入藏匿存储,从而清除您的目录中未提交/已提交的文件。这使得您可以使用apply或pop与stash在任何时间点检索文件。然后,如果您想删除已经暂存的文件,您可以运行:
git stash drop // or clean
要查看如何使用stash的完整说明,请参阅此在Git中如何按名称命名和检索stash?
git stash save
并输入一些注释来说明这个储藏的用途。 - lacostenycodergit stash --all
却移除了数千个文件并破坏了我的项目。这是怎么回事?它甚至移除了vendor目录。我会谨慎使用这个命令。幸运的是,我在本地repo(仓库)中操作,而不是在生产环境中。 - warmwhiskygit stash --all
将会移除 Laravel 中的 vendor 目录、node_modules、.env 和 storage 文件,以及其他我可能遗漏的文件。我必须重新运行 composer install,重新创建我的 .env 文件并在 storage 中重新创建缓存文件夹。这是一个可怕的想法,除非你想要删除未跟踪的文件以及所有在 .gitignore 文件中的内容。 - warmwhiskygit stash push
,该命令还能够存储未跟踪的文件。 - Holger Böhnke
git clean
现在有一个交互模式!请参见我对另一个问题的答案:git 1.8.4+ - VonCgit status
命令,如果它显示有一个文件未被跟踪,并且你不想将该文件添加到版本库中,你可以直接在文件系统中删除或移动它。这样不会对你的本地仓库或 Git 造成任何损害。你也可以使用git clean
或以下答案中的某些变体,包括交互式版本,以仅删除选择的文件,但交互模式可能很繁琐。无论你做什么,一定要确保你理解git clean
将删除哪些内容,或使用--dry-run
让它告诉你而不会真正执行删除操作。 - LightCCrm files-to-be-deleted
。 - mhatch