如何从当前Git工作树中删除本地(未跟踪)文件


6838

如何从当前工作树中删除未跟踪的本地文件?


86
此交互式git备忘单ndpsoftware.com/git-cheatsheet.html显示了git工作区(与“工作副本”相比,“工作区”给Google提供了更好的结果)。
qneill 2013年

28
注意:如果您只想删除一些未跟踪的文件,但不是全部删除,git clean现在可以使用交互模式!看到我对另一个问题的回答:git 1.8.4+
VonC

17
请注意,您不会从git分支中删除文件,因为branch是对提交的引用,因此不包含未跟踪的文件。这些仅存在于工作目录中,与分支无关。那可能只是术语澄清。
PavelŠimerda2014年

6
为了澄清对Git初学者和初学者的理解-运行git status,如果它显示文件未跟踪,并且您不希望该文件在存储库中,则可以转到文件系统并删除或移动它。这不会对您的本地仓库或Git造成任何不利影响。您也可以git clean在下面的答案中使用或进行一些更改,包括交互式版本仅删除选择性文件,但是交互式模式可能很乏味。无论您做什么,git clean都要确保了解要删除的内容或用来--dry-run告诉您的内容而不删除任何内容。
LightCC

4
如果尚未跟踪文件,您是否可以在没有git的情况下将其删除?rm files-to-be-deleted
mhatch

Answers:


8728

git- clean-从工作树中删除未跟踪的文件

概要

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…​

描述

从当前目录开始,以递归方式删除不受版本控制的文件,从而清理工作树。

通常,仅删除Git未知的文件,但是如果-x指定了该选项,则也会删除忽略的文件。例如,这对于删除所有构建产品很有用。

如果<path>...给出任何可选参数,则仅影响那些路径。


步骤1是显示使用-n选项删除的内容:

# Print out the list of files which will be removed (dry run)
git clean -n

清洁步骤- 当心:这将删除文件

# Delete the files from the repository
git clean -f
  • 要删除目录,请运行git clean -f -dgit clean -fd
  • 要删除忽略的文件,请运行git clean -f -Xgit clean -fX
  • 要删除被忽略和未被忽略的文件,请运行git clean -f -xgit clean -fx

请注意X后面两个命令的大小写差异。

如果clean.requireForce在您的配置中将其设置为“ true”(默认设置),则需要指定,-f否则实际上不会发生任何事情。

再次查看git-clean文档以获取更多信息。


选件

-f--force

如果Git配置变量clean.requireForce未设置为false,除非给出或-f,否则git clean将拒绝运行。-n-i

-x

不要使用从.gitignore(每个目录)和中读取的标准忽略规则$GIT_DIR/info/exclude,但仍要使用带有-eoptions 给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。可以使用它(可能与git reset结合使用)创建一个原始的工作目录以测试干净的构建。

-X

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

-n--dry-run

实际上不删除任何内容,只是显示将要执行的操作。

-d

除未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。-f如果您确实要删除这样的目录,请使用两次选项。


287
git clean -f仅在被调用的目录(和子目录)中工作。如果要清理整个工作副本,则应在其根目录中调用它。
Eduardo Bezerra

17
它还会删除.gitignore内部的所有文件。我只需要删除不是.gitignore中的新文件/文件夹
Kostanos 2013年

24
@Kostanos如果您不想删除.gitignore中的文件,请不要提供-x标志。
罗坦

51
git clean -f :/就像您在根仓库目录中运行它一样。另请参阅稍后的答案,也考虑了具有以下内容的子模块git clean -ffxd :/
在这里

18
@Michelle git clean -xfd还将删除您的.gitignore文件中当前被忽略的所有文件,这些文件将不可恢复
thedanotto 2015年

986

用于git clean -f -d确保目录也已删除。

  1. 实际上不删除任何内容,只是显示将要执行的操作。

    git clean -n
    

    要么

    git clean --dry-run
    
  2. 除未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。-f如果您确实要删除这样的目录,请使用两次该选项。

    git clean -fd
    

然后,您可以检查文件是否真的丢失了git status


115
如前所述,最好使用git clean -n -d
Ms01

15
git clean -nd和做同样的事情git clean -fd
米瑟

477

令我惊讶的是,之前没有人提到过:

git clean -i

这表示交互式,您将快速了解要删除的内容,从而可以包含/排除受影响的文件。总体而言,仍比--dry-run真正清洁前运行强制性指令要快。

-d如果您还想照顾空文件夹,则必须折腾。最后,它提供了一个很好的别名:

git iclean

话虽如此,交互命令的额外手握可能会使有经验的用户感到厌烦。这些天我只用已经提到的git clean -fd


16
@ pal4life它是在1.8.4中添加的,您可能正在运行旧版本的git?github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
Mattias Backman

我喜欢这个–与其他任何选项相比,我在bash历史记录中拥有它更自在,因为如果我不小心按ctrl-r或ctrl-p都没关系。
csvoss


250

如果未跟踪的目录是它自己的git存储库(例如,子模块),则需要使用-f两次:

git clean -d -f -f


4
顺便说一句,这是写在文档中的:除非给出第二个-f,否则Git将拒绝删除带有.git子目录或文件的目录。但是还是要谢谢!
Maxim Suslov

247

删除未跟踪文件的简单方法

要删除所有未跟踪文件,最简单的方法是先加他们的一切,并重置回购如下

git add --all
git reset --hard HEAD


8
您可以替换git add --allgit add .。所以,你可以在ONELINE较短的方式做到这一点git add . && git reset --hard HEAD (是非常注意使用这个命令)
RousseauAlexandre

22
为什么要使用这个git clean
user2864740

8
因为git clean显然也删除了所有被忽略的内容。它只是删除了我的node_modules文件夹。这样做将首先暂存除被忽略文件以外的所有文件,然后通过重置将其删除。忽略的文件将不会被触摸。
Andreas

5
@Andreas它不会为我删除忽略的文件(git 2.14.1)。无论如何,您都应该先运行git clean -n,然后再进行真正的删除(或使用git clean -i)。
Qw3ry

8
git clean仅当您使用-x-X选项时,才会删除被忽略的文件,否则,它只会删除未跟踪的文件。
doubleDown

140

我喜欢,git stash push -u因为您可以使用撤消它们git stash pop

编辑:我也找到了一种方法来显示隐藏中的未跟踪文件(例如git show stash@{0}^3https://stackoverflow.com/a/12681856/338986

EDIT2:git stash save不推荐使用push。谢谢@ script-wolf。


3
您能解释一下-u的藏身之处吗?我没有遵循它与git stash save不同的工作方式。我尝试了一下,它奏效了。查看了git docs,也找不到它。
Winnemucca

9
-u等价于--include-untracked。您可以找到有关的帮助git help stash
hiroshi

3
@hiroshi谢谢!在尝试了十几个人的每一个令人毛骨悚然的解决方案之后,这才终于奏效了……哇!甚至连git stash都做nada。保存-您照顾了无法追踪的人。重置硬/清洁力/等这些都不对我有任何帮助。
killjoy

3
save不推荐使用该选项,而推荐使用push,但功能相同,但更多。您可以在这里了解更多信息,https://stackoverflow.com/questions/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952
Script Wolf

120

这就是我一直使用的:

git clean -fdx

对于一个非常大的项目,您可能需要运行几次。


@Martin我正在从事的项目之一是+8年的历史,已有+80个开发人员积极编码。Git有时无法在第一遍清理它。
奥斯卡Fraxedas '16

1
我可以确认这一点,因此这在2020年仍然有效。我们还在做一个大型项目,我不得不运行了4-5次,直到GIT找不到要删除的其他文件。
涡轮蝗虫


86

如果需要从特定子目录中删除未跟踪的文件,

git clean -f {dir_path}

以及删除未跟踪目录/文件和忽略文件的组合方式。

git clean -fxd {dir_path}

之后,您将只能在中修改文件git status


68

删除此repo +子模块中的所有其他文件夹和文件

这使您处于与新克隆相同的状态。

git clean -ffdx

删除此存储库中的所有其他文件夹和文件,但不删除其子模块

git clean -fdx

删除多余的文件夹,但不删除文件(例如build或logs文件夹)

git clean -fd

删除多余的文件夹+被忽略的文件(但不删除新添加的文件)

如果文件未被忽略且尚未签入,则它将保留。请注意大写X。

git clean -fdX

新的互动模式

git clean

57

git clean -fd 删除目录

git clean -fX 删除被忽略的文件

git clean -fx 删除被忽略和未被忽略的文件

可以结合使用以上所有选项

git clean -fdXx

检查git手册以获得更多帮助


10
该命令git clean -fdXx产生错误消息“致命:-x和-X不能一起使用”(使用git-2.8)。对于答案中的最后一句话,请提供git手册的链接。干杯
olibre 2016年

依次运行两个命令:git clean -fdX,git clean -fdx
Clock ZHONG

55

好的,删除不需要的未跟踪文件和文件夹很容易git在命令行中使用,就像这样:

git clean -fd

在执行此操作之前,请仔细检查,因为它会删除文件和文件夹而不会产生任何历史记录...

同样在这种情况下,-f代表力和-d代表目录...

因此,如果只想删除文件,则只能使用-f

git clean -f

如果要删除(目录)和文件,则只能删除未跟踪的目录和文件,如下所示:

git clean -fd

另外,您可以使用-xflag来包含git忽略的文件。如果要删除所有内容,这将很有帮助。

并添加-i标志,使git询问您是否允许随时删除文件。

如果不确定并想先检查一下,请添加-n标志。

-q如果您不想在成功删除后看到任何报告,请使用。

我还创建了下面的图像,使其更令人难忘,尤其是我看到许多人-f有时会混淆清理文件夹或以某种方式混淆它!


删除不需要的未跟踪文件和文件夹


那张图片是什么?
Pacerier

37

更好的方法是使用:git clean

git clean -d -x -f

这会删除未跟踪的文件,包括目录(-d)和被忽略的文件git (-x)

另外,将-f参数替换为-n以执行dry-run-i交互模式,它将告诉您将要删除的内容。


25

用户互动方式:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/arsdumpgenerator/s3/ [y/N]? y

-i表示交互式
-f表示强制
-d表示目录
-x表示忽略的文件(如有需要,

添加注:添加-n--dry-run仅检查其作用。


20

我刚刚发明并尝试过的一种针对这种情况的救生衣(非常有效):

git add .
git reset --hard HEAD

谨防!在执行此操作之前,请确保提交所有必要的更改(即使在未跟踪的文件中)。


3
至少这是一种不同的方法。:)另一种方式是,可以记住reflog中已删除的文件,但不记住任何分支中的内容:git add . git commit -m 'about to delete' git reset --hard HEAD~
joeytwiddle

2
更快的方法是git add . && git reset --hard HEAD
thybzi '16

3
git add . && git reset --hard
Pleymor '16

如果您还希望提交更改,则可能不是您想要的。
lacostenycoder

@AlexanderMills将git reset --hard所有未提交的更改重置,但将未跟踪的文件重置为最新提交的状态。这就是为什么我们首先需要git add .
暂存

19

git clean -f -d -x $(git rev-parse --show-cdup)不管您在存储库目录树中的何处调用,都会将clean应用于根目录。我一直在使用它,因为它不会强迫您离开您现在使用的文件夹,并且可以从您所在的位置直接进行清理和提交。

确保标志-f-d-x满足您的需求:

-d
       Remove untracked directories in addition to untracked files. If an
       untracked directory is managed by a different Git repository, it is
       not removed by default. Use -f option twice if you really want to
       remove such a directory.

-f, --force
       If the Git configuration variable clean.requireForce is not set to
       false, git clean will refuse to delete files or directories unless
       given -f, -n or -i. Git will refuse to delete directories with .git
       sub directory or file unless a second -f is given. This affects
       also git submodules where the storage area of the removed submodule
       under .git/modules/ is not removed until -f is given twice.

-x
       Don't use the standard ignore rules read from .gitignore (per
       directory) and $GIT_DIR/info/exclude, but do still use the ignore
       rules given with -e options. This allows removing all untracked
       files, including build products. This can be used (possibly in
       conjunction with git reset) to create a pristine working directory
       to test a clean build.

还有其他标志,只需检查即可git clean --help


顺便说一句,您只需要执行git clean {flags}:/,就好像您在回购根目录中运行了该命令一样
The-null-Pointer-

19

对我来说,只有以下工作:

git clean -ffdx

在所有其他情况下,我收到一些子目录的“正在跳过目录”消息。


2
谢谢。我省略了-x,只是git clean -ffd为了避免擦除.gitignore中的文件。
Feckmore '17

15

如果您只想删除列出为“ git status”未跟踪的文件

git stash save -u
git stash drop "stash@{0}"

我更喜欢使用“ git clean”,因为“ git clean”将删除git忽略的文件,因此您的下一个构建将必须重新构建所有内容,并且您也可能会丢失IDE设置。


3
这还将删除对跟踪文件的有效更改。我不推荐它。
code_dredd

2
是的,您想先对跟踪的文件进行更改。
jazzdev '16

14

在实际删除之前要知道要删除的内容:

git clean -d -n

它将输出类似:

将删除sample.txt

要删除上一个命令的输出中列出的所有内容:

git clean -d -f

它将输出类似:

删除sample.txt


11

要删除未跟踪的文件,您应该首先使用命令查看将受到清理影响的文件

git clean -fdn

这将向您显示将被删除的文件列表。现在,要实际删除这些文件,请使用以下命令:

git clean -fd

11

运行`git clean`命令时要小心。

-n在运行实际命令之前,请始终使用该命令,因为它将显示要删除的文件。

git clean -n -d 
git clean -f -d

默认情况下,git clean将仅删除未被忽略的未跟踪文件。与您的.gitignore或其他忽略文件中的模式匹配的任何文件都不会被删除。如果您也要删除这些文件,则可以-x在clean命令中添加a 。

git clean -f -d -x

-iclean命令还提供交互模式

git clean -x -i

或者

如果您不能100%确定删除未提交的工作是安全的,则可以使用隐藏方式

git stash --all

它还会清除您的目录,但是可以让您灵活地使用带有applypop的stash随时检索文件。然后,您可以在以后使用以下方法清除存储:

git stash drop // or clean

2
藏起来是个好主意,但是您可能想使用git stash save and type some comment as to what this stash was for
lacostenycoder


9

从git docs删除未跟踪文件的建议命令是git clean

git clean-从工作树中删除未跟踪的文件

建议的方法: 通过使用交互模式,git clean -i 我们可以对其进行控制。让我们看看剩余的可用选项。

可用选项:

git clean 
    -d -f -i -n -q -e -x -X (can use either)

说明:

1. -d

除未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会将其删除。如果您确实要删除这样的目录,请使用-f选项两次。

2. -f,--force

如果Git配置变量clean.requireForce未设置为false,除非给定-f,-n或-i,否则git clean将拒绝运行。

3. -i,--interactive

显示将要执行的操作并以交互方式清理文件。有关详细信息,请参见“交互模式”。

4. -n,--dry-run

实际上不删除任何内容,只是显示将要执行的操作。

5. -q,--quiet

请保持安静,仅报告错误,而不报告成功删除的文件。

6. -e,--exclude =

除了在.gitignore(每个目录)和$ GIT_DIR / info / exclude中找到的那些模式外,还将这些模式视为有效的忽略规则集中。

7. -x

不要使用从.gitignore(每个目录)和$ GIT_DIR / info / exclude读取的标准忽略规则,但仍要使用-e选项提供的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。可以使用它(可能与git reset结合使用)创建一个原始的工作目录以测试干净的构建。

8. -X

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


我认为您输入有误,uggested但这只是“ uggestion大声笑
lacostenycoder

8

普通git clean命令不会使用my删除未跟踪的文件git version 2.9.0.windows.1

$ git clean -fdx     # doesn't remove untracked files
$ git clean -fdx *   # Append star then it works!

7

我们可以使用下面的git注释轻松地从当前git工作树中删除本地未跟踪的文件。

git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

例:

git reset --hard HEAD

友情链接:

  1. https://git-scm.com/docs/git-reset
  2. 如何使用'git reset --hard HEAD'恢复到先前的提交?
  3. 将本地存储库分支重置为类似于远程存储库HEAD
  4. https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html

这还将删除为提交而暂定的更改,不仅删除未跟踪的文件(可能不是您想要的文件)。
粗暴的

不起作用:留下一些文件。git clean -ffdx解决方案
Eugene Gr。Philippov

7

递归清理git仓库和所有子模块

以下命令将递归清除当前的git存储库及其所有子模块:

(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)

当然,应该非常谨慎地使用
lacostenycoder,


5

带有zsh的oh-my-zsh通过git插件提供了那些出色的别名。它们也可以用于bash中。

gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'

  • gclean 除了删除未跟踪的文件之外,还删除未跟踪的目录
  • gpristine硬重置本地更改,删除未跟踪的目录,未跟踪的文件,并且不使用从.gitignore(每个目录)和$ GIT_DIR / info / exclude读取的标准忽略规则,但仍使用-e选项提供的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。可以使用它(可能与git reset结合使用)创建一个原始的工作目录来测试一个干净的build

2
感谢您的反馈,我的发言令人困惑。我想说的是,突出显示的别名是oh-my-zsh自动提供的。他们显然在bash。我修改了答案以反映这一点。
ZenLulz '18年

4

我喜欢使用git stash命令,以后可以保存文件和进行更改。 git clean也是一个不错的选择,但完全取决于您的要求。这是git stash和git clean的说明,7.3 Git工具-隐藏和清洁

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.