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

Posted

技术标签:

【中文标题】如何从当前 Git 工作树中删除本地(未跟踪)文件【英文标题】:How to remove local (untracked) files from the current Git working tree 【发布时间】:2010-09-08 20:09:49 【问题描述】:

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

【问题讨论】:

这个交互式 git 备忘单 ndpsoftware.com/git-cheatsheet.html 显示了 git 工作区(谷歌使用“工作区”比“工作副本”给你更好的结果)。 注意:如果您只想删除 一些 未跟踪的文件,但不是全部git clean 现在有一个 interactive 模式!见my answer to this other question:git 1.8.4+ 为了澄清初学者和 Git 新手的理解 - 运行 git status 如果它显示文件未跟踪,并且您不希望该文件在 repo 中,您可以去到您的文件系统并删除或移动它。这不会对您的本地存储库或 Git 造成任何不利影响。您还可以使用git clean 或以下答案中的一些变体,包括仅删除选择性文件的交互版本,但交互模式可能很乏味。无论您做什么,请确保您了解 git clean 将删除什么或使用 --dry-run 让它告诉您而不删除任何内容。 如果这些文件还没有被跟踪,你不能不用git就删除它们吗? rm files-to-be-deleted 我会把它藏起来,以防你需要再次使用它们并使用 git clean 进行清理:更多细节:git-scm.com/docs/git-clean 【参考方案1】:

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

概要

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

说明

通过递归删除不受版本控制的文件来清理工作树,从当前目录开始

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

如果给出了任何可选的&lt;path&gt;... 参数,则只有那些路径会受到影响。


第 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 -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-n-i,否则 git clean 将拒绝运行。

-x

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

-X

仅删除 Git 忽略的文件。这可能对重建有用 一切从头开始,但保留手动创建的文件。

-n, --dry-run

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

-d

除了未跟踪的文件之外,还删除未跟踪的目录。如果 untracked 目录由不同的 Git 存储库管理,它是 默认情况下不删除。如果您真的想使用两次-f 选项 删除这样的目录。

【讨论】:

git clean -f 仅在调用它的目录(和子目录)中有效。如果你想清理整个工作副本,你应该在它的根目录中调用它。 它也在删除 .gitignore 中的所有文件。我只需要删除新的文件/文件夹而不是 .gitignore @Kostanos 如果您不想删除 .gitignore 中的文件,请不要提供 -x 标志。 git clean -f :/ 就像您在根 repo 目录中运行它一样工作。另请参阅后面的答案,还考虑了 git clean -ffxd :/ 的子模块 在挣扎和诅咒 45 分钟后,我发现了@EduardoBezerra 的评论......我认为 OP 应该编辑他的答案以强调 git clean 的行为 - 只删除你所在目录中的内容 - 和其子目录。从 git help 或答案本身都不清楚。【参考方案2】:

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

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

    git clean -n
    

    git clean --dry-run
    

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

    git clean -fd
    

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

【讨论】:

如前所述,最好使用git clean -n -d 试运行它 git clean -ndgit clean -fd 也是一样。 单独使用-n--dry-run 什么也没做。根据@Ms01 和@Micer,您需要添加-d,如git clean -nd 以显示它将删除的内容。 git clean -fd 为我工作..【参考方案3】:

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

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 仅在从工作副本的根目录调用时才有效?【参考方案4】:

git-clean - Remove untracked files from the working tree

【讨论】:

git clean -f '未跟踪的文件路径'【参考方案5】:

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

要删除所有未跟踪的文件,简单的 方法是首先添加所有这些重置回购如下

git add --all
git reset --hard HEAD

【讨论】:

您可以将git add --all 替换为git add .。所以你可以用更短的方式在单行git add . &amp;&amp; git reset --hard HEAD (使用此命令非常小心) 因为git clean 显然也删除了所有被忽略的内容。它刚刚删除了我的node_modules 文件夹。这样做会首先暂存所有文件,除了被忽略的文件,然后通过重置删除它们。被忽略的文件不会被触及。 @Andreas 它不会为我删除被忽略的文件(git 2.14.1)。 You should run git clean -n 无论如何在进行真正的删除之前(或使用git clean -i)。 git clean 仅在您使用 -x-X 选项时删除被忽略的文件,否则它只会删除未跟踪的文件。 @RousseauAlexandre git add . 仅从当前目录向下添加,而 git add --all 适用于 repo。后者似乎是一个更安全的选择。【参考方案6】:

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

git clean -d -f -f

【讨论】:

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

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

编辑:我还找到了一种在存储中显示未跟踪文件的方法(例如git show stash@0^3)https://***.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://***.com/questions/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952【参考方案8】:

这是我经常使用的:

git clean -fdx

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

【讨论】:

@Martin 我正在从事的项目之一是 +8 岁,其中 +80 名开发人员积极编码。 Git 有时无法在第一遍清理它。 我可以确认这一点,所以这在 2020 年仍然有效。我们也在做一个大型项目,我不得不运行它 4-5 次,直到 GIT 没有找到更多要删除的文件.【参考方案9】:

git-clean 是您正在寻找的。它用于从工作树中删除未跟踪的文件。

【讨论】:

【参考方案10】:

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

git clean -f dir_path

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

git clean -fxd dir_path

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

【讨论】:

【参考方案11】:

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

这会让你处于与新克隆相同的状态。

git clean -ffdx

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

git clean -fdx

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

git clean -fd

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

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

git clean -fdX

新的交互模式

git clean

【讨论】:

这个答案很好用!您可以随时添加 --dry-run 选项以在提交操作之前列出要删除的文件/文件夹【参考方案12】:

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

git clean -fd

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

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

所以,如果你只想删除文件,你可以只使用-f

git clean -f

如果您想删除(目录)和文件,您可以只删除未跟踪的目录和文件,如下所示:

git clean -fd

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

并添加-i 标志,使 git 请求您允许在旅途中一一删除文件。

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

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

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

【讨论】:

【参考方案13】:

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 手册的链接。干杯【参考方案14】:

更好的方法是使用:git clean

git clean -d -x -f

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

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

【讨论】:

【参考方案15】:

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

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

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

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

git clean -f -d -x

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

git clean -x -i

或者

如果您不能 100% 确定删除未提交的工作是否安全,则可以使用 stash
git stash --all

它还会清除您的目录,但让您可以灵活地随时使用 stashapplypop 检索文件。然后,如果您可以删除隐藏的文件,您可以运行:

git stash drop // or clean

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

【讨论】:

存储是个好主意,但是您可能想使用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,它也可以存储未跟踪的文件【参考方案16】:

用户交互方式:

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 只是检查它会做什么。

【讨论】:

【参考方案17】:

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

git add .
git reset --hard HEAD

当心!确保提交任何需要的更改(即使在非未跟踪文件中)在执行此操作之前

【讨论】:

至少这是一种不同的方法。 :) 另一种方法是:git add .git commit -m 'about to delete'git reset --hard HEAD~ 更快捷的方法是git add . &amp;&amp; git reset --hard HEAD git add . &amp;&amp; git reset --hard @AlexanderMills git reset --hard 将所有未提交的更改但未跟踪的文件重置为最新提交的状态。这就是为什么我们首先需要git add . - 暂存所有未跟踪的文件(因此它们也被重置)【参考方案18】:

对我来说只有以下工作:

git clean -ffdx

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

【讨论】:

谢谢。我省略了-x,只是使用git clean -ffd 来避免擦除.gitignore 中的文件。【参考方案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 :/ 这样就好像你在 repo root 中运行了命令【参考方案20】:

要删除未跟踪的文件:

git add .
git reset --hard HEAD

【讨论】:

【参考方案21】:

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

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

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

【讨论】:

这也将删除对跟踪文件的有效更改。我不会推荐它。 是的,您需要先提交对跟踪文件的更改。【参考方案22】:

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

git clean -d -n

它会输出如下内容:

将删除 sample.txt

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

git clean -d -f

它会输出如下内容:

删除 sample.txt

【讨论】:

【参考方案23】:

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

git clean -fdn

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

git clean -fd

【讨论】:

【参考方案24】:

从 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,git clean 将拒绝运行,除非给定 -f、-n 或 -i。

3. -i, --interactive

以交互方式显示要执行的操作和清理文件。详见“交互模式”。

4. -n, --dry-run

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

5. -q, --quiet

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

6. -e , --exclude=

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

7. -x

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

8. -X

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

【讨论】:

我认为你有一个错字uggested 但这只是一个“uggestion 哈哈【参考方案25】:

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

【讨论】:

【参考方案26】:

普通的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!

【讨论】:

【参考方案27】:

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

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

【讨论】:

【参考方案28】:

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

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

示例:

git reset --hard HEAD

链接:

    https://git-scm.com/docs/git-reset How do I use 'git reset --hard HEAD' to revert to a previous commit? Reset local repository branch to be just like remote repository HEAD https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html

【讨论】:

这还将删除暂存为提交的更改,而不仅仅是未跟踪的文件,这可能不是您想要的。 不起作用:留下一些文件。 git clean -ffdx 是解决方案【参考方案29】:

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

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

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

【讨论】:

当然应该谨慎使用【参考方案30】:
git clean -f

将从当前 git 中删除未跟踪的文件

git clean -fd

当您要删除目录和文件时,这将只删除未跟踪的目录和文件

【讨论】:

以上是关于如何从当前 Git 工作树中删除本地(未跟踪)文件的主要内容,如果未能解决你的问题,请参考以下文章

git - 移除文件以及取消对文件的跟踪

如何忽略未跟踪文件中的 .DS_Store? [复制]

如何从 git 跟踪中删除文件? [复制]

Git入门到高级系列2-git高级操作

删除本地文件后 Git从远程仓库重新获取

git文件的生命周期