【问题标题】:How to remove local (untracked) files from the current Git working tree如何从当前 Git 工作树中删除本地(未跟踪)文件
【发布时间】:2019-10-02 03:57:39
【问题描述】:

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

【问题讨论】:

  • 这个交互式 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

标签: git branch git-branch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • git clean -f '未跟踪的文件路径'
    【解决方案3】:

    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 或答案本身都不清楚。
    【解决方案4】:

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

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

      git clean -n
      

      git clean --dry-run
      
    2. 除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由不同的 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 为我工作..
    【解决方案5】:

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

    git clean -d -f -f

    【讨论】:

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

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

    git clean -f {dir_path}
    

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

    git clean -fxd {dir_path}
    

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

    【讨论】:

      【解决方案7】:

      这是我经常使用的:

      git clean -fdx
      

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

      【讨论】:

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

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

      git clean -i
      

      这代表交互式,您将快速了解将要删除的内容,从而为您提供包含/排除受影响文件的可能性。总体而言,仍然比在真正清理之前运行强制--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 仅在从工作副本的根目录调用时才有效?
      【解决方案9】:

      我喜欢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
      【解决方案10】:

      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 手册的链接。干杯
      【解决方案11】:

      更好的方法是使用:git clean

      git clean -d -x -f
      

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

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

      【讨论】:

        【解决方案12】:

        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 中运行了命令
        【解决方案13】:

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

        git clean -d -n

        它会输出如下内容:

        将删除 sample.txt

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

        git clean -d -f

        它会输出如下内容:

        删除 sample.txt

        【讨论】:

          【解决方案14】:

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

          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 . - 暂存所有未跟踪的文件(因此它们也被重置)
          【解决方案15】:

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

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

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

          【讨论】:

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

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

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

          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。后者似乎是一个更安全的选择。
          【解决方案17】:

          对我来说只有以下工作:

          git clean -ffdx
          

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

          【讨论】:

          • 谢谢。我省略了-x,只是使用git clean -ffd 来避免擦除.gitignore 中的文件。
          【解决方案18】:

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

          【讨论】:

            【解决方案19】:

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

            git clean -fdn
            

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

            git clean -fd
            

            【讨论】:

              【解决方案20】:

              注意:首先导航到目录并签出您要清理的分支。

              -i 交互模式,它会告诉你要删除的内容,你可以从列表中选择一个动作。

              1. 仅清理 文件 [不会列出文件夹,也不会清理文件夹]: $ git clean -i

              2. 要清理文件和文件夹$ git clean -d -i

              -d 包括目录。


              如果您从列表中选择c。将删除未跟踪的文件/文件夹,还将删除您弄乱的文件/文件夹。*

              例如:如果您重新构建远程文件夹中的文件夹并将更改拉到本地计算机。最初由其他人创建的文件/文件夹将位于过去的文件夹和您重组的新文件夹中。

              【讨论】:

                【解决方案21】:

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

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

                git clean -ffdx
                

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

                git clean -fdx
                

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

                git clean -fd
                

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

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

                git clean -fdX
                

                新的交互模式

                git clean
                

                【讨论】:

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

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

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

                【讨论】:

                  【解决方案23】:

                  用户交互方式:

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

                  【讨论】:

                    【解决方案24】:

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

                    git clean -fd
                    

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

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

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

                    git clean -f
                    

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

                    git clean -fd
                    

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

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

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

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

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


                    【讨论】:

                      【解决方案25】:

                      使用git reset HEAD &lt;file&gt; 取消暂存文件

                      【讨论】:

                        【解决方案26】:

                        从 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 哈哈
                        【解决方案27】:

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

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

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

                        【讨论】:

                        • 当然应该谨慎使用
                        【解决方案28】:

                        运行 `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,它也可以存储未跟踪的文件
                        【解决方案29】:

                        oh-my-zshzsh 通过 git 插件提供了这些出色的别名。它们也可以在 bash 中使用。

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

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

                        【讨论】:

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

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

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

                        示例:

                        git reset --hard HEAD
                        

                        链接:

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

                        【讨论】:

                        • 这还将删除暂存为提交的更改,不仅是未跟踪的文件,这可能不是您想要的。
                        • 不起作用:留下一些文件。 git clean -ffdx 是解决方案
                        猜你喜欢
                        • 2010-11-24
                        • 1970-01-01
                        • 2015-10-03
                        • 1970-01-01
                        • 2014-08-09
                        • 1970-01-01
                        • 2021-01-29
                        相关资源
                        最近更新 更多