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

git branch git-branch

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

此交互式 git 备忘单 ndpsoftware.com/git-cheatsheet.html 显示了 git 工作区(谷歌使用“工作区”比“工作副本”为您提供更好的结果)。

注意:如果您只想删除 一些 未跟踪的文件,但不是全部git clean 现在有一个交互 模式!参见my answer to this other question:git 1.8.4+

在发布新答案之前,请考虑此问题已有 25 多个答案。确保您的答案贡献了现有答案之外的内容

为了澄清对 Git 新手和新手的理解 - 运行 git status ,如果它显示一个文件未跟踪,并且您不希望该文件在 repo 中,您可以转到您的文件系统并删除或移动它.这不会对您的本地存储库或 Git 造成任何不利影响。您还可以使用 git clean 或以下答案中的一些变体,包括交互式版本来仅删除选择性文件,但交互模式可能很乏味。无论您做什么,请确保您了解 git clean 将删除什么或使用 --dry-run 让它告诉您而不删除任何内容。

如果这些文件还没有被跟踪,你不能在没有 git 的情况下删除它们吗? rm files-to-be-deleted

2
24 revs, 22 users 18%

git-clean - 从工作树中删除未跟踪的文件提要 git clean [-d] [-f] [-i] [-n] [-q] [-e ] [-x | -X] [--] …​ 描述 从当前目录开始,通过递归删除不受版本控制的文件来清理工作树。通常,只删除 Git 未知的文件,但如果指定了 -x 选项,也会删除忽略的文件。例如,这对于删除所有构建产品很有用。如果给出了任何可选的 ... 参数,则只有那些路径会受到影响。

第 1 步是显示使用 -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,除非给定 -f、-n 或 -i,否则 git clean 将拒绝运行。 -x 不要使用从 .gitignore(每个目录)和 $GIT_DIR/info/exclude 读取的标准忽略规则,但仍然使用 -e 选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以用来(可能与 git reset 结合使用)来创建一个原始工作目录来测试一个干净的构建。 -X 仅删除 Git 忽略的文件。这可能有助于从头开始重建所有内容,但保留手动创建的文件。 -n, --dry-run 实际上不删除任何东西,只是显示将要做什么。 -d 除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由不同的 Git 存储库管理,则默认情况下不会将其删除。如果您真的想删除这样的目录,请使用两次 -f 选项。

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

它还删除了 .gitignore 中的所有文件。我只需要删除新的而不是 .gitignore 中的文件/文件夹

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

git clean -f :/ 就像您在根存储库目录中运行它一样工作。另请参阅后面的答案,也考虑使用 git clean -ffxd :/ 的子模块

在挣扎和诅咒了 45 分钟后,我找到了@EduardoBezerra 的评论......我认为 OP 应该编辑他的答案以强调 git clean 的行为——只删除你所在目录及其子目录中的内容。从 git help 或答案本身都不清楚。

G
Gabriel Staples

使用 git clean -f -d 确保 directories 也被删除。

实际上不要删除任何东西,只是显示将要做什么。 git clean -n 或 git clean --dry-run 除了未跟踪的文件之外,删除未跟踪的目录。如果未跟踪的目录由不同的 Git 存储库管理,则默认情况下不会将其删除。如果您真的想删除这样的目录,请使用两次 -f 选项。 git 清理 -fd

然后您可以使用 git status 检查您的文件是否真的消失了。

如前所述,最好使用 git clean -n -d 进行空运行

git clean -ndgit clean -fd 也是一样。

单独使用 -n--dry-run 没有任何作用。根据 @Ms01 和 @Micer,您需要添加 -d,如 git clean -nd 以显示它将删除的内容。

S
Shashank Agrawal

我很惊讶之前没有人提到这一点:

git clean -i

这代表 interactive,您将快速了解将要删除的内容,从而为您提供包含/排除受影响文件的可能性。总体而言,仍然比在真正清洁之前运行强制 --dry-run 快。

如果您还想处理空文件夹,则必须加入 -d。最后,它形成了一个很好的别名:

git iclean

话虽如此,对于有经验的用户来说,额外手持交互式命令可能会很累。这些天我只使用已经提到的git clean -fd

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

我喜欢这个——我更喜欢在我的 bash 历史中使用它而不是其他任何选项,因为如果我不小心 ctrl-r 或 ctrl-p 到它,这没什么大不了的。

是否只有从工作副本的根目录调用 git clean -i 才有效?

u
user229044

git clean -f '未跟踪的文件路径'

s
soniiic

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

要删除所有未跟踪的文件,简单的方法是首先添加所有文件并重置 repo,如下所示

git add --all
git reset --hard HEAD

您可以将 git add --all 替换为 git add .。因此,您可以在一行 git add . && git reset --hard HEAD (使用此命令时要非常小心) 以更短的方式执行此操作。

因为 git clean 显然也删除了所有被忽略的内容。它刚刚删除了我的 node_modules 文件夹。这样做会首先暂存所有文件,除了被忽略的文件,然后通过重置删除它们。被忽略的文件不会被触及。

@Andreas 它不会为我删除被忽略的文件(git 2.14.1)。 You should run git clean -n 在进行真正的删除之前(或使用 git clean -i)。

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

@RousseauAlexandre git add . 仅从当前目录向下添加,而 git add --all 适用于 repo。后者似乎是一个更安全的选择。

M
Michał Szajbe

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

git clean -d -f -f

顺便说一句,这写在 documentation 中:Git 将拒绝删除带有 .git 子目录或文件的目录,除非给出第二个 -f 。不过还是谢谢!

O
Oscar Fraxedas

这是我一直使用的:

git clean -fdx

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

@Martin 我正在从事的项目之一是 +8 岁,有 +80 名开发人员积极编码。 Git 有时无法在第一次通过时清理它。

我可以确认这一点,所以这在 2020 年仍然有效。我们也在做一个大型项目,我不得不运行它 4-5 次,直到 GIT 找不到更多要删除的文件。

要记住的主要事情是,上述命令仅适用于您所在的目录。因此,如果您在子文件夹中运行上述命令,则它不会从父文件夹或其他子文件夹中删除未跟踪的文件。

h
hiroshi

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

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

EDIT2:git stash save 已弃用,取而代之的是 push。谢谢@script-wolf。

你能解释一下藏匿处的 -u 吗?我不了解它与 git stash save 的工作方式有何不同。我试过了,它奏效了。在 git docs 上查看,也找不到它。

-u 等同于 --include-untracked。您可以通过 git help stash 找到帮助。

@hiroshi 谢谢!在尝试了十几个不同的人的每一个该死的解决方案之后,这就是最终奏效的解决方案......哇!即使是 git stash 也没有。保存 - 你照顾未跟踪。 reset hard /clean force/etc 这些都没有为我做任何事情。

save 选项已被弃用,取而代之的是 push,后者的作用相同但更多。您可以在此处阅读更多内容,https://stackoverflow.com/questions/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952

P
Peter Mortensen

git-clean 是您要查找的内容。它用于从工作树中删除未跟踪的文件。

V
Vijay C

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

git clean -f {dir_path}

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

git clean -fxd {dir_path}

在此之后,您将仅在 git status 中修改文件。

S
Shital Shah

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

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

git clean -ffdx

删除此 repo 中的所有额外文件夹和文件,但不删除其子模块

git clean -fdx

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

git clean -fd

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

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

git clean -fdX

新的交互模式

git clean

这个答案很好用!您始终可以添加 --dry-run 选项以在提交操作之前列出要删除的文件/文件夹

D
DevWL

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

始终先使用 -n

在运行 clean 命令之前始终使用 -n,因为它会显示哪些文件将被删除。

-d 通常情况下,当指定 no 时, git clean 不会递归到未跟踪的目录,以避免删除太多。指定 -d 使其也递归到此类目录中。如果指定了任何路径,则 -d 无关紧要;所有匹配指定路径的未跟踪文件(除了 --force 下提到的嵌套 git 目录)都将被删除。

-f | --force 如果 Git 配置变量 clean.requireForce 没有设置为 false,除非给定 -f 或 -i,否则 git clean 将拒绝删除文件或目录。除非给出第二个 -f,否则 Git 将拒绝修改未跟踪的嵌套 git 存储库(带有 .git 子目录的目录)。

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

如果输出是您要删除的内容,现在不使用 -n 运行。

git clean -d -f

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

git clean -f -d -x

还有可用的交互模式 -i 与 clean 命令

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)

基于使用的标志的存储可以通过将它们写入存储存储来从未暂存/暂存文件中清除目录。我可以灵活地使用 stash 和 apply 或 pop 在任何时间点检索文件。然后,如果您可以删除隐藏的文件,您可以运行:

git stash drop // or clean

要查看有关如何使用 stash 的完整说明,请参阅此How to name and retrieve a stash by name in git?

https://i.stack.imgur.com/G356U.jpg

存储是个好主意,但是您可能想使用 git stash save and type some comment as to what this stash was for

我想从各种目录中删除大约 20 张图像,但 git stash --all 删除了数千个文件并破坏了我的项目。那是怎么回事?它甚至删除了供应商目录。我会谨慎使用它。幸运的是,我是在家里的本地仓库中执行此操作,而不是在生产环境中。

git stash --all 将删除 Laravel 中的供应商目录、node_modules、.env 和存储文件以及我错过的其他内容。我必须作曲安装,重新创建我的 .env 文件并在存储中重新创建缓存文件夹。除非您想删除未跟踪的文件以及 .gitignore 文件中的所有内容,否则这是一个糟糕的主意

较新的 git 版本可以使用 git stash push,它也可以存储未跟踪的文件

A
Alireza

好的,在命令行中使用 git 可以轻松删除 不需要的未跟踪文件和文件夹,只需这样做:

git clean -fd

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

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

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

git clean -f

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

git clean -fd

此外,您可以使用 -x 标志来包含 git 忽略的文件。如果您想删除所有内容,这将很有帮助。

并添加 -i 标志,使 git 要求您在旅途中一一删除文件的权限。

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

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

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

https://i.stack.imgur.com/3W563.png

P
Pooja

git clean -fd 删除目录

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

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

可以组合使用上述所有选项

git clean -fdXx

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

命令 git clean -fdXx 产生错误消息 "fatal: -x and -X cannot be used together"(使用 git-2.8)。对于答案中的最后一句话,请提供 git 手册的链接。干杯

P
Piyush

更好的方法是使用: git clean

git clean -d -x -f

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

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

b
bit_cracker007

用户交互方式:

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 以检查它将做什么。

t
thybzi

我刚刚发明并尝试过的这种情况的救生窍门(效果很好):

git add .
git reset --hard HEAD

谨防!在执行此操作之前,请务必提交任何需要的更改(即使是在未跟踪的文件中)。

至少这是一种不同的方法。 :) 另一种方法是:git add . git commit -m 'about to delete' git reset --hard HEAD~

更快捷的方法是 git add . && git reset --hard HEAD

git add . && git reset --hard

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

r
rahul286

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

git clean -ffdx

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

谢谢。我省略了 -x,只使用了 git clean -ffd 以避免擦除 .gitignore 中的文件。

N
Nikita Leonov

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} :/ 就好像您在 repo root 中运行了命令一样

R
Rajeev Shetty

要删除未跟踪的文件:

git add .
git reset --hard HEAD
J
JD Brennan

如果您只想删除被 'git status' 列为未跟踪的文件

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

我更喜欢它而不是 'git clean' 因为 'git clean' 会删除被 git 忽略的文件,所以你的下一个构建将不得不重建所有内容,你也可能会丢失你的 IDE 设置。

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

是的,您首先要提交对跟踪文件的更改。

O
Omar Mowafi

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

git clean -d -n

它将输出如下内容:

将删除 sample.txt

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

git clean -d -f

它将输出如下内容:

删除 sample.txt

G
Gaurav

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

git clean -fdn

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

git clean -fd
j
jenny

git add --allgit stashgit stash drop,请按此顺序尝试这三个命令,以删除所有未跟踪的文件。通过将所有这些未跟踪的文件添加到 git 并存储它们会将所有这些未跟踪的文件移动到存储列表并删除最上面的文件,即 stash@{0} 将从存储列表中删除隐藏的更改。

M
Mohideen bin Mohammed

从 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,--强制

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

3.-i,--交互式

显示将要做什么并以交互方式清理文件。有关详细信息,请参阅“交互模式”。

4.-n,--干运行

实际上不要删除任何东西,只是显示将要做什么。

5.-q,--安静

安静,只报告错误,不报告成功删除的文件。

6. -e,--排除=

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

7.-x

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

8.-X

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

我认为您有一个错字uggested,但这只是一个“uggestion哈哈

V
Vaisakh VM

git clean -f to remove untracked files from working directory.

我在博客中介绍了一些基础知识,git-intro-basic-commands

k
kujiy

正常的 git clean 命令不会使用我的 git version 2.9.0.windows.1 删除未跟踪的文件。

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

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

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

例子:

git reset --hard HEAD

链接:

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

这还将删除暂存为提交的更改,不仅是未跟踪的文件,这可能不是您想要的。

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

S
Sergey

递归清理 git 存储库和所有子模块以下命令将递归清理当前 git 存储库及其所有子模块: (git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)

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

J
Jämes

oh-my-zsh with zsh 通过 git 插件提供了这些很棒的别名。它们也可以在 bash 中使用。

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

gclean 除了删除未跟踪的文件外,还删除未跟踪的目录。

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

感谢您的反馈,我的陈述令人困惑。我想说突出显示的别名会自动与 oh-my-zsh 一起出现。他们显然在 bash 中工作得很好。我编辑了我的答案以反映这一点。