2012-07-18 66 views
88

有没有一种方便的方法来忽略git仓库中所有未跟踪的文件和文件夹?
(我知道关于.gitignore。)git:如何忽略所有目前未追踪的文件?

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

+3

使用'-uno'标志。 – nhahtdh 2012-07-18 13:39:14

+0

[有没有办法让git不显示未跟踪文件?](http://stackoverflow.com/questions/2774416/is-there-a-way-to-get-git-not-to -show-the-untracked-files) – random 2012-07-28 04:48:07

+0

或者你可能想添加一个*到你的.gitignore文件。 :) – vilicvane 2013-08-07 07:38:04

回答

202

正如前面已经说过,从状态只排除使用:

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

如果你不是想永久不理你能目前未跟踪的文件,从您项目的根源,发布:

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

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

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

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

这将创建完成创建.gitignore文件前子shell。

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

  • git status --porcelain使用的git status --short因为manual状态改为“为脚本提供易于解析的格式输出,这与短输出类似,但在git版本中保持稳定并且不管用户配置如何。“因此,我们有两个parseability和稳定性;
  • grep '^??'滤波器仅开始的行??,其中,根据所述git status manual,对应于未跟踪文件;
  • cut -c4-移除每一行,这使的前3个字符我们只是相对路径未跟踪文件;
  • |符号pipes,其前一个命令的输出传递到下面的命令的输入;
  • >>>符号redirect operators,其附加的输出的公关evious命令分别覆盖/创建一个新文件。

另一种变体为那些喜欢谁using sed代替grepcut,还有一种方法:

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

如果我没有达到我的f#$%投票限制,我肯定会++这个。 – sjas 2013-02-28 18:36:45

+2

'cut -c4-'**删除每行的前4个字符,这给我们提供了未跟踪文件的相对路径; **号'-c'标记要删除的列号列表的开始。并且'4-'*选择*从第4列到结尾的行,从而切换第1-3列。所以你的cut命令实际上会删除每行的前3个字符。如果你从一个git状态行中删除了4个字符,例如这里的这个文件:'? app/views/static_pages/contact.html.erb',你会删除'app'的第一个字母。所以命令是正确的,但解释是错误的。 – 7stud 2014-09-10 21:03:46

+0

@ 7stud:谢谢你,你说的对,我写错了4。我已经解决了答案。 – Diego 2014-09-11 10:17:43

2

两种方式:

将参数“-uno”用于git-status。这里有一个例子:

[[email protected]_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) 
[[email protected]_vmware:ft]$ git status -uno 
# On branch ft 
nothing to commit (working directory clean) 

或者,您可以添加文件和directires到的.gitignore,在这种情况下,他们将永远不会出现。

+2

编辑“.gitignore”作为'git status |猫>> temp && vim temp'。然后编辑该文件,以便删除前几行和最后一行,并在后面追加'#'和空格。然后'cat temp >> .gitignore && rm temp'。如果以前没有'.gitignore','mv temp .gitignore'会做。丑陋的东西,但比手动更新'.gitignore'更好。 – sjas 2012-07-18 13:53:34

+1

这个答案不正确。正确答案是'-uno'。如果使用'-u no',它相当于'no -u' - 它会在名为'no'(可能不存在)的文件上执行一个状态并使用默认的'-u'模式。即它相当于'git status no' – 2016-03-01 10:50:56

10

发现它在the manual

git status -uno

+29

那么如果每个人都会在发布前RTFM,我们都不会得到任何代表:-) – 2012-07-18 13:43:15

+4

但是这篇文章没有回答这个问题。 RTQ似乎更合适。 – 2014-02-19 18:33:04

+1

@ Sridhar-Sarnobat我的回答回答了我的问题,所以我不明白你想告诉的是什么? – sjas 2015-04-30 11:39:09

1

如果你有很多未跟踪文件,并且不希望“ gitignore“所有这些,请注意,因为git 1.8.3 (April, 22d 2013)git status会提及--untracked-files=no,即使您并未在第一位添加该选项!

git status”建议用户在需要太长时间时使用--untracked=no选项进行调查。

4

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

+0

即使这样也不完全正确。 'git status -u X'等同于'git status X -u'('X'不是'-u'的参数)。这又相当于'git status X'(因为没有参数的'-u'是默认的'-u')。因此,它只是文件'X'上的git-status。所以,如果'X'是'no',它只会尝试在名为'no'的文件上执行git status,您可能没有该文件 – 2016-03-01 10:53:24

31

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

git ls-files --others --exclude-standard >> .gitignore 
+3

为什么这不会得到多少票?无需通过其他2个程序! – JoelFan 2017-01-04 21:56:02

+3

@JoelFan:两个理由: 1)**这个只从git的根目录开始工作,而接受的从每个子目录开始工作,你只需要调整目标'.gitignore'路径 2)if你有一个未被跟踪的目录,**这个列表中的每一个单独的文件,而不是未跟踪的目录本身**(所以你不会忽略该目录,因此仍然可以在未被跟踪的目录中报告未来的文件,而接受的只列出目录,而不是内部未跟踪的文件,这是你想要做的事情,但通常你只是想忽略整个目录 – Diego 2017-06-30 13:50:36

+1

谢谢Poolie我欣赏你的建议的不同之处* *因为@Diego提到的几点我开始使用文件和文件夹库,我不想跟踪/推送原始文件,我只想跟踪我在库中添加或重建的文件。 PA租文件夹将忽略所有内容。这/你的解决方案快速添加所有1696个文件。的xD – Chaos7703 2017-07-30 02:58:51

相关问题