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

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

回答

根据Git Documentation git clean


第1步是使用以下-n选项显示将删除的内容:

# Print out the list of files which will be removed (dry run)
git clean -n

清洁步骤 - 注意:这将删除文件:

# 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

- 力

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

-X

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

-X

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

-n

--dry运行

不要删除任何东西,只显示将要做的事情.

-d

除了未跟踪的文件之外,删除未跟踪的目录.如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它.如果您确实要删除此类目录,请使用-f选项两次.

  • `git clean -f`只能在它被调用的目录(和子目录)中工作.如果要清理整个工作副本,则应在其根目录中调用它.
  • `git clean -f:/`就好像你在root repo目录中运行它一样.另请参阅后面的答案,还要考虑使用`git clean -ffxd:/`的子模块
  • @Kostanos如果您不想删除.gitignore中的文件,请不要提供-x标志.
  • @Michelle git clean -xfd还将删除当前在你的.gitignore中忽略的所有文件,它们是不可恢复的
  • 它还删除.gitignore中的所有文件.我只需要删除新文件/文件夹,而不是.gitignore
  • 注意,-x或-X标志会删除.gitignore忽略的文件,但不会删除那些`update-index --assume-unchanged`忽略的文件。
  • @ maan81,你说得对.`git clean -f`与简单删除文件没什么区别.但这并不会使它变得毫无用处,因为我可能会错误地认为你暗示了这一点.当你有很多构建工件,即数十个目录中的数百个文件时,"简单地删除"它们可能会变得不那么"简单".你必须编写脚本.这就是`git clean -f`为你做的事情,因为它确切知道哪些文件做了什么,哪些文件不属于回购.
  • 在经历了45分钟的挣扎和诅咒之后,我发现了@ EduardoBezerra的评论......我认为OP应该编辑他的答案以强调git clean的行为 - 只删除你所在目录中的东西 - 及其子目录.从git帮助或答案本身来看并不清楚.

用于git clean -f -d确保还删除了目录.

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

  • 如前所述,使用`git clean -n -d`干好运行它
  • 同样的事情是`git clean -nd`和`git clean -fd`.

我很惊讶之前没有人提到过:

git clean -i

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

-d如果你还想要处理空文件夹,你将不得不抛弃.最后,它有一个很好的别名:

git iclean

话虽这么说,额外的手持交互式命令可能会让有经验的用户感到厌倦.这些天我只是使用已经提到的git clean -fd

  • @ pal4life它是在1.8.4中添加的,你可能正在运行旧版本的git?https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
  • @SystematicFrank,不要使用别名,它们实际上不超过1人....

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


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

git clean -d -f -f

  • 顺便说一句,这是在[文档](http://git-scm.com/docs/git-clean)中写的:除非给出第二个-f,否则Git将拒绝删除带.git子目录或文件的目录.但无论如何,谢谢!

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

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

git add --all
git reset --hard HEAD

  • 为什么要用这个`git clean`?
  • 你可以用'git add .`替换`git add --all`.所以你可以在oneline`git add中以更短的方式完成它.&& git reset --hard HEAD`*(用这个命令非常小心)*.
  • 只有使用`-x`或`-X`选项时,`git clean`才会删除被忽略的文件,否则只删除未跟踪的文件.
  • 因为````git clean```显然也删除了被忽略的一切.它刚刚删除了我的```node_modules```文件夹.执行此操作将首先暂存除被忽略的文件之外的所有文件,然后通过执行重置来删除它们.忽略忽略的文件.
  • @Andreas它不会为我删除被忽略的文件(git 2.14.1).[你应该在执行真正的删除之前运行`git clean -n`](/sf/answers/4547651/)(或者使用[`git clean -i`](https:// stackoverflow. COM /一个/二百四十四万八千四百四十零分之二千○八十四万六千七百七十九)).
  • @RousseauAlexandre `git add .` 仅从当前目录向下添加,而 `git add --all` 适用于 repo。后者似乎是一个更安全的选择。

我喜欢git stash push -u因为你可以用它们全部撤消它们git stash pop.

编辑:我也发现了一种方法来显示未被跟踪的文件(例如git show stash@{0}^3)/sf/answers/887729951/

EDIT2:git stash save不赞成使用push.谢谢@ script-wolf.

  • `-u`相当于`--include-untracked`.你可以找到`git help stash`的帮助.
  • 你能解释一下藏匿处的 -u 吗?我不理解它与 git stash save 的工作方式不同。我试过了,它奏效了。查看 git 文档,也找不到它。
  • @hiroshi 谢谢!在尝试了十几个不同的人的每一个该死的解决方案之后,这个终于奏效了……哇!甚至一个 git stash 也做了 nada。保存 - 你照顾未跟踪。重置硬/清洁力/等这些都没有为我做任何事情。
  • `save` 选项被弃用,取而代之的是 `push`,它的作用相同但功能更多。你可以在这里阅读更多内容,[/sf/ask/3127601991/](https://stackoverflow. com/questions/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952)

这就是我经常使用的:

git clean -fdx

对于一个非常大的项目,您可能希望运行它几次.

  • 你能解释一下大项目的评论吗?

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


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

git clean -f {dir_path}

并结合使用方法删除未跟踪的目录/文件和忽略的文件.

git clean -fxd {dir_path}

在此之后,您将只修改文件git status.


git clean -fd 删除目录

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

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

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

git clean -fdXx

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

  • 命令`git clean -fdXx`产生错误消息*"致命:-x和-X不能一起使用"*(使用git-2.8).对于你答案中的最后一句话,请提供git手册的链接.干杯

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

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

git clean -ffdx

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

git clean -fdx

仅删除额外的文件夹但不删除文件(例如构建文件夹)

git clean -fd

删除额外的文件夹+忽略的文件(但不删除任何新添加的文件)

如果文件未被忽略且尚未签入,那么它将保留.注意大写字母X.

git clean -fdX

新的互动模式

git clean

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

git clean -fd

在执行之前仔细检查,因为它将删除文件和文件夹而不创建任何历史记录...

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

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

git clean -f

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

git clean -fd

此外,您可以使用-xflag来包含git忽略的文件.如果要删除所有内容,这将非常有用.

并添加-i标志,使git要求您在移动中逐个删除文件的权限.

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

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

我还创建了下面的图像,使其更具记忆性,特别是我看到很多人-f有时会混淆清理文件夹或以某种方式混合它!


更好的方法是使用: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 for interactive
-f for force
-d for directory
-x for ignored files(如果需要,添加)

注意: 添加-n--dry-run以检查它将执行的操作.


要删除未跟踪的文件:

git add .
git reset --hard HEAD

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 -ffdx

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

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

我刚刚发明并尝试过这种情况的生活方式(完美无缺):

git add .
git reset --hard HEAD

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

  • `git 添加。&& git reset --hard`
  • 至少这是一种不同的方法.:)另一种方式,那将记住reflog中但不在任何分支中的已删除文件,将是:`git add .`` git commit -m'即将删除'``git reset --hard HEAD~`
  • 更快捷的方法是 ```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 存储库和所有子模块

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

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

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

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

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

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

git clean -f -d -x

-iclean命令还提供了交互模式

git clean -x -i

另外

如果您不是100%确定删除未提交的作品是安全的,则可以使用存储

git stash --all

它还将清除您的目录,但允许您使用带有applypop的存储在任何时间点检索文件.然后在稍后您可以使用以下方法清除您的存储:

git stash drop // or clean
  • the stash is a good idea, however you might wanna use `git stash save and type some comment as to what this stash was for`

git clean -f

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

git clean -fd

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


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


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

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


用于从git docs中删除未跟踪文件的 uggested命令是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,则除非给定-f,-n或-i,否则git clean将拒绝运行.

3.-i, - 相互作用

显示将要执行的操作并以交互方式清理文件.有关详细信息,请参阅"交互模式"

4. -n, - 干跑

不要删除任何东西,只显示将要做的事情.

5. -q, - quiet

保持安静,仅报告错误,但不报告成功删除的文件.

6. -e, - exclude =

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

7. -x

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

8. -X

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


带有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 reset 结合使用)来创建原始工作目录以测试干净的构建
  • 感谢您的反馈,我的陈述令人困惑。我想说突出显示的别名是 oh-my-zsh 自动出现的。他们显然在`bash`中工作得很好。我编辑了我的答案以反映这一点。

普通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.html

以上是如何从当前的Git工作树中删除本地(未跟踪)文件?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>