【问题标题】:git: How to ignore all present untracked files?git:如何忽略所有存在的未跟踪文件?
【发布时间】:2012-07-18 13:35:39
【问题描述】:

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

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

【问题讨论】:

  • 或者你可能想在你的 .gitignore 文件中添加一个 *。 :)
  • 只是一个* 很可能不是您想要的。
  • 对这么多不正确的答案感到惊讶。 -u no 是错误的。 -uno 是正确的。 -u no 尝试对名为 no 的文件进行状态处理! no 不是 -u 的参数。要强制将no 解释为-u 的参数,必须没有空格。要对此进行测试,请执行touch Invalid 并将git status -uInvalidgit status -u Invalid 进行比较。

标签: git gitignore


【解决方案1】:

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

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,它在创建.gitignore 文件之前完成

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

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

另一种变体,对于那些更喜欢using sed 而不是grepcut 的人,这里有另一种方式:

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

【讨论】:

  • cut -c4- 删除每行的前 4 个字符,这只是为我们提供了未跟踪文件的相对路径; 否。-c 标志着列表的开始要剪切的列号。并且4- 选择从第 4 列到末尾的行,它会剪切第 1-3 列。所以你的 cut 命令实际上删除了每行的前 3 个字符。如果您从 git 状态行中删除了 4 个字符,例如此处用于此文件的字符:?? app/views/static_pages/contact.html.erb,您将删除 app 的第一个字母。所以命令是正确的,但是解释是错误的。
  • @7stud:谢谢,你说得对,我写错了4。我已经确定了答案。
  • 我非常感谢命令解释。很高兴知道我从互联网上复制的随机命令在做什么,并帮助我们大家学习如何更好地使用命令行和 git。
  • -u no 对我不起作用。但是-uno 可以。我已经相应地更新了答案。这是 git 的奇怪设计。我在 git 1.7.1
  • @AaronMcDaid:谢谢。更改记录在here,并在here进行了讨论
【解决方案2】:

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

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

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

【讨论】:

  • 为什么没有得到尽可能多的选票?无需通过其他 2 个程序进行管道传输!
  • @JoelFan: 两个原因:1) 这个只适用于 git 的根目录,而接受的一个适用于每个子目录,你只需要调整目标.gitignore 路径 2)如果您有一个未跟踪的目录,此目录列出其中的每个文件,但不列出未跟踪的目录本身(因此您不会忽略该目录,因此仍然将目录中的未来文件报告为未跟踪,而接受的仅列出目录,而不列出其中未跟踪的文件。这是您想要做什么的问题,但通常您只想忽略整个目录
  • 谢谢 Poolie 我很欣赏您的建议的不同 of因为@Diego 提到的几点我开始使用文件和文件夹库而且我不想跟踪/推送原始文件。我只想跟踪我在库中添加或重建的文件。添加父文件夹将忽略所有内容。这个/您的解决方案迅速添加了所有 1696 个文件。 xD
  • 这也可以使用git config status.showUntrackedFiles no来实现。
  • @Diego,它仅适用于根 git 目录是不准确的。它适用于任何子目录,但会添加到该子目录.gitignore,这在许多用例中都有效
【解决方案3】:

the manual找到它

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

git status -uno

【讨论】:

  • 好吧,如果每个人都在发帖前进行 RTFM,我们都不会得到任何代表 :-)
【解决方案4】:

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

git config --local status.showUntrackedFiles no

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

【讨论】:

  • 问题标题提到“当前未跟踪的文件”,因此没有提到忽略未来的文件。我会说,忽略所有未来未跟踪的文件是一个非常罕见的用例。
  • 谢谢!正是我想要的! (即使它似乎不是这里的 OP 正在寻找的东西......)@Diego,任何在 StackOverflow 上搜索类似这样的东西的人都可能有一个罕见的用例,哈哈。
【解决方案5】:

两种方式:

  • 使用参数-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,在这种情况下它们将永远不会出现。

【讨论】:

  • 编辑.gitignore 的便捷方法是git status | cat &gt;&gt; temp &amp;&amp; vim temp。然后编辑文件,删除前几行和最后一行,以及尾随# 和它后面的空格。然后cat temp &gt;&gt; .gitignore &amp;&amp; rm temp。如果之前没有.gitignoremv temp .gitignore 可以。丑陋的东西,但比手动更新.gitignore 更好。
  • 这个答案不正确。正确答案是-uno。如果你使用-u no,它就等同于no -u——它将在一个名为no(可能不存在)的文件上做一个状态,并使用默认的-u模式。即相当于git status no
【解决方案6】:

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

【讨论】:

  • 即使这样也不完全正确。 git status -u X 等价于 git status X -uX 不是 -u 的参数)。这又相当于git status X(因为没有参数的-u 是默认的-u)。因此,它只是文件X 上的一个git-status。因此,如果 Xno 它只是尝试对名为 no 的文件执行 git 状态,而您可能没有该文件
【解决方案7】:

如果您不是在类似 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

【讨论】:

  • 这是做什么的?
【解决方案8】:

如果您有很多未跟踪的文件,并且不想“gitignore”所有文件,请注意,因为git 1.8.3 (April, 22d 2013)git status 会提到@987654324 @即使你一开始没有添加那个选项!

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

【讨论】:

    【解决方案9】:

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

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

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

    这里的答案其实很简单,虽然我必须找到this blog 才能弄清楚:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2015-02-03
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多