如何从当前工作树中删除未跟踪的本地文件?
41 回答
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 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,git clean 将拒绝运行,除非给定
-f
,-n
或-i
.
-x
不要使用从 .gitignore (每个目录)和 读取的标准忽略规则
$GIT_DIR/info/exclude
,但仍然使用-e
选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以用来(可能与 git reset 结合使用)来创建一个原始工作目录来测试一个干净的构建。
-X
仅删除 Git 忽略的文件。这可能有助于从头开始重建所有内容,但保留手动创建的文件。
-n
,--dry-run
实际上不要删除任何东西,只是显示将要做什么。
-d
除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由不同的 Git 存储库管理,则默认情况下不会将其删除。
-f
如果您真的想删除这样的目录,请使用选项两次。
用于git clean -f -d
确保目录也被删除。
实际上不要删除任何东西,只是显示将要做什么。
git clean -n
或者
git clean --dry-run
除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由不同的 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
如果 untracked 目录是自己的 git 仓库(例如子模块),则需要使用-f
两次:
git clean -d -f -f
我喜欢git stash push -u
,因为你可以用git stash pop
.
编辑:我还找到了一种在存储中显示未跟踪文件的方法(例如git show stash@{0}^3
)https://stackoverflow.com/a/12681856/338986
EDIT2:git stash save
已弃用,取而代之的是push
. 谢谢@script-wolf。
这是我一直使用的:
git clean -fdx
对于一个非常大的项目,您可能需要运行几次。
git-clean是您正在寻找的。它用于从工作树中删除未跟踪的文件。
如果需要从特定子目录中删除未跟踪的文件,
git clean -f {dir_path}
以及删除未跟踪的目录/文件和忽略文件的组合方式。
git clean -fxd {dir_path}
在此之后,您将仅在git status
.
删除此 repo + 子模块中的所有额外文件夹和文件
这使您处于与新鲜克隆相同的状态。
git clean -ffdx
删除此 repo 中的所有额外文件夹和文件,但不删除其子模块
git clean -fdx
删除额外的文件夹,但不删除文件(例如 build 或 logs 文件夹)
git clean -fd
删除多余的文件夹 + 忽略的文件(但不是新添加的文件)
如果文件未被忽略且尚未签入,则它会保留。注意大写 X。
git clean -fdX
新的交互模式
git clean
git clean -fd
删除目录
git clean -fX
删除被忽略的文件
git clean -fx
删除忽略和未忽略的文件
可以组合使用上述所有选项
git clean -fdXx
查看 git 手册以获得更多帮助
好的,删除不需要的未跟踪文件和文件夹很容易git
在命令行中使用,只需这样做:
git clean -fd
在执行此操作之前请仔细检查,因为它会删除文件和文件夹而不会产生任何历史记录...
同样在这种情况下,-f
代表力并-d
代表目录...
因此,如果您只想删除文件,则只能使用-f
:
git clean -f
如果要删除(目录)和文件,则只能删除未跟踪的目录和文件,如下所示:
git clean -fd
此外,您可以使用-x
flag 来包含 git 忽略的文件。如果您想删除所有内容,这将很有帮助。
并添加-i
标志,使 git 要求您在旅途中一一删除文件的权限。
如果您不确定并想先检查一下,请添加-n
标志。
-q
如果您不想在成功删除后看到任何报告,请使用此选项。
我还创建了下面的图像以使其更令人难忘,尤其是我看到很多人-f
有时会混淆清理文件夹或以某种方式将其混淆!
运行 `git clean` 命令时要小心。
始终 -n
在运行实际命令之前使用,因为它会显示哪些文件将被删除。
git clean -n -d
git clean -f -d
默认情况下,git clean
只会删除未被忽略的未跟踪文件。任何与 .gitignore 或其他忽略文件中的模式匹配的文件都不会被删除。如果你也想删除这些文件,你可以-x
在 clean 命令中添加一个。
git clean -f -d -x
-i
clean 命令还提供交互模式
git clean -x -i
或者
如果您不能 100% 确定删除未提交的工作是否安全,则可以使用 stashgit stash --all
使用之前stash --all
注意:如果使用该--all
选项,则除了未跟踪的文件之外,忽略的文件也会被隐藏和清理。
Stash 也将清除您的目录,但让您可以灵活地随时使用stash和apply或pop检索文件。然后,如果您可以删除隐藏的文件,您可以运行:
git stash drop // or clean
要查看有关如何使用存储的完整说明,请参阅如何在 git 中按名称命名和检索存储?
更好的方法是使用: git clean
git clean -d -x -f
这将删除未跟踪的文件,包括(-d)
被git (-x)
.
此外,将-f
参数替换-n
为执行 adry-run
或-i
for 交互模式,它会告诉您将删除什么。
用户交互方式:
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)
无论您在存储库目录树中的哪个位置调用它,都适用于根目录。我一直使用它,因为它不会强迫你离开你现在工作的文件夹,并允许你从你所在的地方清理和提交。
确保 flags -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
它将输出如下内容:
将删除 sample.txt
要删除上一个命令输出中列出的所有内容:
git clean -d -f
它将输出如下内容:
删除 sample.txt
要删除未跟踪的文件,您应该首先使用命令查看将受到清理影响的文件
git clean -fdn
这将向您显示将被删除的文件列表。现在要实际删除这些文件,请使用以下命令:
git clean -fd
git add --all
,git stash
和git stash drop
, 按此顺序尝试这三个命令,以删除所有未跟踪的文件。通过将所有这些未跟踪的文件添加到 git 并存储它们会将所有这些未跟踪的文件移动到存储列表并删除最上面的文件,即 stash@{0} 将从存储列表中删除隐藏的更改。
从 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 忽略的文件。这可能有助于从头开始重建所有内容,但保留手动创建的文件。
普通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!
git clean -f to remove untracked files from working directory.
我们可以使用下面的 git 注释轻松地从当前的 git 工作树中删除本地未跟踪的文件。
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
例子:
git reset --hard HEAD
链接:
递归清理 git 存储库和所有子模块
以下命令将递归清除当前 git 存储库及其所有子模块:
(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)
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 结合使用)来创建一个原始工作目录来测试一个干净的构建。
git clean -f
将从当前 git 中删除未跟踪的文件
git clean -fd
当您要删除目录和文件时,这将只删除未跟踪的目录和文件
我喜欢使用git stash
命令,稍后您可以获得隐藏的文件和更改。
git clean
也是一个不错的选择,但完全取决于您的要求。这里是 git stash 和 git clean 的解释,7.3 Git Tools - Stashing and Cleaning
注意:首先导航到目录并签出要清理的分支。
-i
交互模式,它将告诉您将删除的内容,您可以从列表中选择一个操作。
只清理文件[文件夹不会被列出也不会被清理]:
$ git clean -i
清理文件和文件夹:
$ git clean -d -i
-d
包括目录。
如果您c
从列表中选择。将删除未跟踪的文件/文件夹,还将删除您弄乱的文件/文件夹。*
例如:如果您重组远程文件夹中的文件夹并将更改拉到本地计算机。最初由其他人创建的文件/文件夹将位于过去的文件夹和您重组的新文件夹中。
我在这里使用最流行的答案失败了 - git 无论如何都不会从存储库中删除未跟踪的文件。不知道为什么。这是我的超级简化答案,没有特殊的 Git 命令!
任务:从 git 存储库中删除未跟踪的文件:
- 将文件和文件夹从本地项目文件夹移至其他位置一段时间
- 删除 .gitignore 中关于提交的这些文件和文件夹的所有行
- git 添加 .
- Git commit -m “从未跟踪的文件中清理存储库”</li>
- git推送
所有文件和文件夹已从存储库中删除。
如果需要,让我们在 localhost 上恢复它们:
- 将您临时移动的所有文件和文件夹再次移回本地项目文件夹
- 将有关这些文件和文件夹的所有行移回 .gitignore
- git 添加 .
- git commit -m “检查或文件不再出现在 git 存储库中”</li>
- git推送
你完成了!
要删除完整的更改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
用于git reset HEAD <file>
取消暂存文件
如果没有其他工作,只需删除“git status”命令列出的所有更改,可以使用以下组合:
git add -A && git commit -m temp && git reset --hard HEAD^
这将首先暂存您的所有更改,然后创建一个临时提交,然后将其丢弃。
这可以使用 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 clean [-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
我用这个:
git status
- 复制文件的路径
rm <path of file>
我的项目有很多由巨大的 ANT 构建脚本创建的生成文件。使用git clean
会造成混乱。