Git: 如何忽略当前所有未跟踪的文件?

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

因此,git status将再次提供一个干净的结果。

204340 次浏览

两种方式:

  • 使用从 -unogit-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,在这种情况下,它们将永远不会显示出来。

手册找到的

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

git status -uno

如前所述,从状态中排除仅仅使用:

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

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

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

随后对 git status的每次调用都将显式忽略这些文件。

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

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

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

由于我得到了很多选票(谢谢!) ,我想我最好解释一下这个命令:

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

对于那些更喜欢 使用 sed而不是 grepcut的人来说,还有另外一种方法:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

如果您有 很多未跟踪的文件,并且不想“ gitignore”所有这些文件,请注意,因为 Git 1.8.3(2013年4月22日)git status将提到 --untracked-files=no,即使你没有添加该选项在第一位!

git status”建议用户考虑使用 --untracked=no选项时,它需要太长的时间。

-u no也不显示非暂存文件。 -uno按照需要工作,显示非暂存文件,但隐藏非跟踪文件。

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

  1. 更改为 git 树的根。
  2. git ls-files --others --exclude-standard >> .gitignore

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

你在 Unix 上不像操作系统的情况下,这将使用 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

我来这里是想解决一个稍微不同的问题,也许这个对别人有用:

我创建了一个新的分支 feature-a。作为这个分支的一部分,我创建了新的目录,需要修改。来压制他们中的一些人。当向创建各种缓存文件夹的项目添加新工具时,这种情况经常发生。.serverless.terraform等。

在我准备合并回主文件夹之前,我有一些其他的东西出现,所以我再次检查 master,但是现在 git status再次检查那些被抑制的文件夹,因为。吉蒂诺尔还没被合并。

这里的答案其实很简单,尽管我必须找到 这个博客才能找到答案:

只需检查 feature-a分支的. gitignore 文件

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"

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

git config --local status.showUntrackedFiles no

当添加不在 .gitignore中的新文件时,接受的答案不起作用

以上的答案对我来说都不管用。

在我的示例中,我希望永久忽略个人配置文件(git status -uno只适用于一种用法)。

我是一个团队的一部分,所以不能把它添加到 .gitignore,因为这已经签入。

穆氏解决方案是将其添加到:

.git/info/exclude

这就像你自己的个人 .gitignore文件。