148

有没有一种方便的方法可以忽略 git 存储库中所有未跟踪的文件和文件夹?
(我知道.gitignore。)

所以git status会再次提供一个干净的结果。

4

9 回答 9

278

如前所述,要从状态中排除,只需使用:

git status -uno  # must be "-uno" , not "-u no"

如果您想永久忽略当前未跟踪的文件,您可以从项目的根目录启动:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

每次后续调用都git status将明确忽略这些文件。

更新:上面的命令有一个小缺点:如果你还没有.gitignore文件,你的 gitignore 会忽略自己!发生这种情况是因为文件是在执行.gitignore之前创建的git status --porcelain。因此,如果您还没有.gitignore文件,我建议您使用:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

这将创建一个子shell,该子shell在创建文件之前完成。.gitignore

命令解释因为我得到了很多选票(谢谢!)我想我最好解释一下命令:

  • git status --porcelain使用而不是git status --short因为手动状态“以易于解析的格式为脚本提供输出。这类似于简短的输出,但在 git 版本之间以及无论用户配置如何都将保持稳定。” 所以我们兼具可解析性和稳定性;
  • grep '^??'仅过滤以 开头的行??,根据git status 手册,这些行对应于未跟踪的文件;
  • cut -c4-删除每行的前 3 个字符,这只是为我们提供了未跟踪文件的相对路径;
  • |符号是管道它将上一个命令的输出传递给下一个命令的输入;
  • 和符号是重定向运算符>>,它们分别将上一个命令的输出附加到文件或覆盖/创建新文件。>

对于那些喜欢使用sed而不是grepand的人的cut一种变体,这是另一种方式:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
于 2013-02-28T17:36:12.693 回答
59

如果您想永久忽略这些文件,添加它们的简单方法.gitignore是:

  1. 切换到 git 树的根目录。
  2. git ls-files --others --exclude-standard >> .gitignore

这将枚举未跟踪目录中的所有文件,这可能是也可能不是您想要的。

于 2016-01-10T17:57:07.653 回答
19

在手册中找到

mode 参数用于指定未跟踪文件的处理。它是可选的:默认为 all,如果指定,则必须坚持选项(例如 -uno,但不是 -u no)。

git status -uno

于 2012-07-18T13:40:31.167 回答
6

恕我直言,比公认的答案更好的是使用以下内容:

git config --local status.showUntrackedFiles no

接受的答案不适用于添加不在其中的新文件时.gitignore

于 2021-01-22T14:28:44.760 回答
4

两种方式:

  • 使用参数-uno. git-status这是一个例子:

    [jenny@jenny_vmware:ft]$ git status
    # On branch ft
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #       foo
    nothing added to commit but untracked files present (use "git add" to track)
    [jenny@jenny_vmware:ft]$ git status -uno
    # On branch ft
    nothing to commit (working directory clean)
    
  • 或者您可以将文件和目录添加到.gitignore,在这种情况下它们将永远不会出现。

于 2012-07-18T13:39:51.197 回答
3

-u no也不显示未暂存的文件。 -uno按需要工作并显示未上演,但隐藏未跟踪。

于 2014-07-17T13:57:51.347 回答
2

如果您不在 Unix 之类的操作系统上,这将在Windows上使用PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

但是,.gitignore文件必须有一个新的空行,否则无论它是否有内容,它都会将文本附加到最后一行。

这可能是一个更好的选择:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore

于 2018-05-02T20:32:42.703 回答
1

如果您有很多未跟踪的文件,并且不想“ gitignore”所有这些文件,请注意,从git 1.8.3 (April, 22d 2013) 开始,即使您没有在第一名!git status--untracked-files=no

" git status" 建议用户--untracked=no在时间过长时考虑使用选项。

于 2013-04-23T08:07:22.540 回答
0

我来这里是为了解决一个稍微不同的问题。也许这对其他人有用:

我创建了一个新分支feature-a。作为这个分支的一部分,我创建了新目录,并且需要修改 .gitignore 来抑制其中的一些。在将新工具添加到创建各种缓存文件夹的项目中时,这种情况经常发生。 .serverless,.terraform等。

在我准备好将它合并回 master 之前,我还有其他东西出现,所以我master再次结帐,但现在再次git status拿起那些被抑制的文件夹,因为 .gitignore 尚未合并。

这里的答案实际上很简单,虽然我不得不找到这个博客来弄清楚:

feature-a只需从分支签出 .gitignore 文件

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
于 2020-07-12T18:16:02.197 回答