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

sja*_*jas 119 git gitignore

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

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

Die*_*ego 245

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

git status -uno  # must be "-uno" , not "-u no"
Run Code Online (Sandbox Code Playgroud)

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

git status --porcelain | grep '^??' | cut -c4- >> .gitignore
Run Code Online (Sandbox Code Playgroud)

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

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

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore
Run Code Online (Sandbox Code Playgroud)

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

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

  • git status --porcelain是用来代替git status --short因为手动状态"以易于解析的格式为脚本提供输出.这类似于短输出,但在git版本中保持稳定,无论用户配置如何." 所以我们既有可解析性又有稳定性;
  • grep '^??'仅过滤以...开头的行??,根据git status手册,它们对应于未跟踪的文件;
  • cut -c4- 删除每行的前3个字符,这只给出了未跟踪文件的相对路径;
  • |符号是管道,这通过前面的命令为以下命令的输入的输出;
  • >>>符号是重定向运营商,这前一命令的输出附加到文件或覆盖/分别创建一个新文件,.

另一种变体为那些喜欢谁使用sed,而不是grepcut,还有一种方法:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
Run Code Online (Sandbox Code Playgroud)

  • `cut -c4-`**删除每行的前4个字符,它只给出了未跟踪文件的相对路径;**No.`-c`标记要剪切的列号列表的开头.并且`4 -`*选择*从第4列到结尾的行,这将删除第1-3列.所以你的剪切命令实际上删除了每行的前3个字符.如果您从git状态行中删除了4个字符,例如此文件中的字符:`?? app/views/static_pages/contact.html.erb`,你会删除`app`的第一个字母.所以命令是正确的,但解释是错误的. (2认同)
  • 我非常感谢命令解释.很高兴知道我从互联网上复制的随机命令是什么,并帮助我们所有人学习如何更好地使用命令行和git. (2认同)
  • @AaronMcDaid:谢谢.这里的变化记录在这里[http://www.spinics.net/lists/git/msg260063.html],并讨论了[这里](http://www.spinics.net/lists/git/msg259971.html ) (2认同)

poo*_*lie 48

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

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

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

  • 为什么这不会得到那么多票?无需管理其他2个程序! (3认同)
  • @JoelFan:两个原因:1)**这个只能从git**的根目录起作用,而被接受的一个可以从每个子目录中运行,你只需要调整目标`.gitignore`路径2)如果你有一个未跟踪的目录,**这个列出了它中的每个单独的文件,但不是未跟踪的目录本身**(因此你不会忽略该目录,因此仍然可以将目录中的未来文件报告为未跟踪,同时接受一个只列出目录,而不是里面未跟踪的文件.这是你想要做的事情,但通常你只想忽略整个目录 (3认同)

sja*_*jas 16

手册中找到它

git status -uno

  • 好吧,如果每个人在发布之前都会RTFM,我们都不会得到任何代表:-) (35认同)
  • 但这篇文章没有回答这个问题.RTQ似乎更合适. (5认同)
  • 这个答案是不正确的.正确的答案是`-uno`.如果使用`-u no`,它相当于`no -u` - 它将在名为`no`的文件(可能不存在)上执行状态,并使用默认的`-u`模式.即它相当于`git status no` (2认同)

Ok *_*his 13

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

git config --local status.showUntrackedFiles no

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

  • 问题标题提到“当前未跟踪的文件”,因此没有提到忽略未来的文件。我想说,忽略所有未来未跟踪的文件也是一个非常罕见的用例。 (2认同)

Sno*_*ash 10

上述答案都不适合我。

就我而言,我希望永久忽略个人配置文件(git status -uno仅适用于一次)。

我是团队的一员,因此无法将其添加到.gitignore已签入的团队中。

Mu 的解决方案是将其添加到:

.git/info/exclude
Run Code Online (Sandbox Code Playgroud)

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


Jen*_*y D 6

两种方式:

  • -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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者您可以将文件和目录添加到.gitignore,在这种情况下它们将永远不会显示。

  • 编辑 `.gitignore` 的一个便捷方法是 `git status | cat &gt;&gt; temp &amp;&amp; vim temp`. 然后编辑文件,删除前几行和最后一行,以及尾随的“#”和后面的空格。然后 `cat temp &gt;&gt; .gitignore &amp;&amp; rm temp`。如果之前不存在“.gitignore”,则“mv temp .gitignore”即可。丑陋的东西,但比手动更新“.gitignore”更好。 (2认同)

foo*_*all 5

-u no也不显示未暂存的文件。 -uno按预期工作并显示未暂存的内容,但隐藏未跟踪的内容。