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


131

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

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



或者,您可能想在.gitignore文件中添加一个*。:)
vilicvane

1
只是*很可能不是您想要的。
sjas 2013年


惊讶于这么多不正确的答案。-u no是错的。-uno是正确的。-u no尝试对名为no!的文件进行状态检查!该no不是一个参数-u。要强制no将其解释为的自变量-u,必须没有空格。为了测试这个,做touch Invalid和比较git status -uInvalidgit status -u Invalid
亚伦·麦克戴

Answers:


251

如前所述,要将状态排除在外,只需使用:

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

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

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

以后每次调用git status都会显式忽略那些文件。

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

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

这将创建完成一个子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

3
cut -c4- 删除每行的前4个字符,这仅给我们未跟踪文件的相对路径;No. -c标记要剪切的列号列表的开头。并 4- 选择从第4列到末尾的行,该行将剪切第1-3列。因此,您的cut命令实际上删除了每行的前3个字符。如果您从git状态行中删除了4个字符(例如此文件的此处?? app/views/static_pages/contact.html.erb):,则会删除的第一个字母app。因此命令正确,但解释错误。
2014年

@ 7stud:谢谢,您是对的,我写错了4。我已经解决了答案。
迭戈

2
我非常感谢命令说明。很高兴知道我从互联网上复制的随机命令在做什么,并且可以帮助我们所有人更好地使用命令行和git。
Eric Fitting 2015年

1
-u no对我不起作用。但是-uno可以。我已经相应地更新了答案。这对git来说是很奇怪的设计。我使用git 1.7.1
Aaron McDaid

2
@AaronMcDaid:谢谢。此处记录更改,并在此处进行
Diego

51

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

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

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


3
为什么这没有得到那么多的选票?无需通过其他2个程序进行传输!
JoelFan

4
@JoelFan:两个原因:1)这个仅从git的根开始工作,而被接受的一个从每个子目录开始工作,您只需要调整目标.gitignore路径2)如果您有未跟踪的目录,则每个列出该目录并其中的每个文件,但不包含未跟踪的目录本身(因此,您不会忽略该目录,因此仍会在该目录中报告未跟踪的将来文件,而被接受的文件仅列出目录,而不列出其中的未跟踪的文件。这是您要执行的操作,但是通常您只想忽略整个目录
迭戈

1
谢谢Poolie,我感谢您提出的建议有所不同因为 @Diego提到的几点我开始使用文件和文件夹库,但我不想跟踪/推送原始文件。我只想跟踪在库中添加或重建的文件。添加父文件夹将忽略所有内容。这个/您的解决方案迅速添加了所有1696个文件。xD
Chaos7703

也可以使用来实现git config status.showUntrackedFiles no
larsch

16

手册中找到它

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

git status -uno


39
好吧,如果每个人都在发布前进行RTFM,我们谁都不会得到任何代表:-)
珍妮·D

4

两种方式:

在git-status中使用参数“ -uno”。这是一个例子:

[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,在这种情况下,它们将永远不会显示。


2
编辑.gitignore存在的一种简便方法git status | cat >> temp && vim temp。然后编辑文件,以便删除前几行和最后一行,以及尾随#和空格。然后cat temp >> .gitignore && rm temp。如果.gitignore以前不存在,mv temp .gitignore则可以。丑陋的东西,但是比.gitignore手动更新更好。
sjas 2012年

1
这个答案是不正确的。正确的答案是-uno。如果使用-u no,则等效于no -u-它将在名为no(可能不存在)的文件上做一个状态,并使用默认-u模式。即,它等效于git status no
Aaron McDaid

3

-u no也不显示未暂存的文件。 -uno可以按需工作,并且显示为未暂存,但隐藏为未跟踪。


1
即使这也不完全正确。 git status -u X等价于git status X -uX不是的参数-u)。反过来,这等效于git status X(因为-u没有参数是默认值-u)。因此,它只是file上的git-status X。所以,如果Xno它只是试图做一个文件git的状态叫no,你可能没有
阿伦McDaid

2

如果您不在像 OS这样的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


1

如果你有大量的未跟踪文件,并且不希望“ gitignore”所有的人,请注意,由于git的1.8.3(四月,22D 2013年)git status将提及--untracked-files=no,即使你没有在添加选项第一名!

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


0

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

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

在准备将其合并回主服务器之前,我还有其他事情,因此我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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.