繁体   English   中英

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

[英]How to remove local (untracked) files from the current Git working tree

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

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

概要

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

描述

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

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

如果给出任何可选的<path>... arguments,则只有那些路径受到影响。


第 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,则 git clean 将拒绝运行,除非给定-f-n-i

-x

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

-X

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

-n , --dry-run

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

-d

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

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

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

     git clean -n

    或者

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

     git clean -fd

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

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

git clean -i

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

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

git iclean

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

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

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

git add --all
git reset --hard HEAD

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

git clean -d -f -f

这是我一直使用的:

git clean -fdx

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

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

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

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

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

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

git clean -f {dir_path}

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

git clean -fxd {dir_path}

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

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

这会让你在相同的 state 中作为新克隆。

git clean -ffdx

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

git clean -fdx

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

git clean -fd

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

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

git clean -fdX

新的交互模式

git clean

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

始终先使用-n

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

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

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

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

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

git clean -d -f

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

git clean -f -d -x

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

git clean -x -i

或者

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

在使用stash --all之前注意:如果使用了--all选项,那么除了未跟踪的文件之外,忽略的文件也会被隐藏和清理。

 git stash push --keep-index

如果使用 --keep-index 选项,则已添加到索引的所有更改都将保持不变。 您的分阶段更改保留在您的工作区中,但同时,它们也保存到您的存储中。

在没有任何 arguments 的情况下调用git stash等效于git stash push

git stash drop // or clean

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

 git stash drop // or clean

要查看有关如何使用存储的完整说明,请参阅如何在 git 中按名称命名和检索存储?

在此处输入图像描述

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

git clean -fd

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

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

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

git clean -f

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

git clean -fd

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

并添加-i标志,使 git 请求您允许在 go 上逐个删除文件。

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

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

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


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

git clean -fd删除目录

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

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

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

git clean -fdXx

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

更好的方法是使用:git clean

git clean -d -x -f

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

此外,将-f参数替换为-n以执行dry-run-i用于交互模式,它会告诉您将删除什么。

用户交互方式:

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

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

git add .
git reset --hard HEAD

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

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

git clean -ffdx

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

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 add .
git reset --hard HEAD

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

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

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

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

git clean -d -n

它将 output 类似于:

将删除 sample.txt

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

git clean -d -f

它将 output 类似于:

删除 sample.txt

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

git clean -fdn

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

git clean -fd

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

从 git 文档中删除未跟踪文件的建议命令是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,则 git clean 将拒绝运行,除非给出 -f、-n 或 -i。

3.-i,--交互式

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

4.-n,--干运行

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

5.-q,--安静

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

6.-e,--排除=

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

7.-x

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

8.-X

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

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

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

正常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!

通过使用下面的 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.ZFC35FDC70D5FC69D2539883A822C7

递归清除 git 存储库和所有子模块

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

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

带有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 重置结合使用)来创建原始工作目录以测试干净的构建
git clean -f

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

git clean -fd

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

我喜欢使用git stash命令,稍后您可以获取隐藏的文件和更改。 git clean也是一个不错的选择,但完全取决于您的要求。 这是 git stash 和 git clean, 7.3 Git Tools - Stash and Cleaning的解释

删除完全更改git clean -f -d

$ git clean -f -d
Removing client/app/helpers/base64.js
Removing files/
Removing package.json.bak

where 
-f is force 
-d is a directory 

我认为安全和简单的方法是这样的!

git add .
git stash 

欲了解更多信息https://www.atlassian.com/git/tutorials/saving-changes/git-stash#stashing-your-work

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

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

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

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

-d包括目录。


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

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

我在这里使用最流行的答案失败了 - git 无论如何都不会从存储库中删除未跟踪的文件。 不知道为什么。 这是我的超级简化答案,没有特殊的 GIT 命令!

任务:从 git 存储库中删除未跟踪的文件:

  1. 将文件和文件夹从本地项目文件夹移至其他位置一段时间
  2. 删除 .gitignore 中关于提交的这些文件和文件夹的所有行
  3. Git 添加。
  4. Git commit -m “从未跟踪的文件中清理存储库”
  5. Git推

所有文件和文件夹已从存储库中删除。

如果需要,让我们在 localhost 上恢复它们:

  1. 将您临时移动的所有文件和文件夹再次移回本地项目文件夹
  2. 将有关这些文件和文件夹的所有行移回 .gitignore
  3. Git 添加。
  4. Git commit -m “检查或文件不再出现在 git 存储库中”
  5. Git推

你完成了!

如果没有其他工作,只需删除“git status”命令列出的所有更改,可以使用以下组合:

git add -A && git commit -m temp && git reset --hard HEAD^

这将首先暂存您的所有更改,然后创建一个临时提交,然后将其丢弃。

使用git reset HEAD <file>文件

这可以使用 shell 脚本来完成,我使用此脚本列出将要删除的内容,然后让我确认操作。

这很有用,因为我有时会在擦除所有内容之前检查补丁或其他文件。

#!/bin/bash
readarray -t -d '' FILES < <(git ls-files -z --other --directory)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi
echo -e "Dirty files:\n"
printf '  %s\n' "${FILES[@]}"
DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
        rm -rfv -- "$f"
    done
fi

用法:git 清洁 [-d] [-f] [-i] [-n] [-q] [-e] [-x | -X] [ - ]...

-q, --quiet           do not print names of files removed
-n, --dry-run         dry run
-f, --force           force
-i, --interactive     interactive cleaning
-d                    remove whole directories
-e, --exclude <pattern>
                      add <pattern> to ignore rules
-x                    remove ignored files, too
-X                    remove only ignored files

我用这个:

  1. git status
  2. 复制文件的路径
  3. rm <path of file>

我的项目有很多由巨型 ANT 构建脚本创建的生成文件。 使用git clean会造成混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM