有没有一种方便的方法可以忽略Git存储库中所有未跟踪的文件和文件夹?
(我知道 .gitignore
的存在。)
这样,git status
命令就会再次提供干净的结果。
正如已经提到的,要从状态中排除,只需使用:
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
.gitignore
文件之前完成。
命令说明:由于我得到了很多投票(谢谢!),我认为我最好解释一下命令:
git status --porcelain
而不是git status --short
,因为manual指出“以易于解析的脚本格式提供输出。这类似于短输出,但将在git版本和用户配置无关的情况下保持稳定。” 因此我们既有可解析性又有稳定性;grep '^??'
过滤只包含以??
开头的行,这根据 git status manual 对应于未跟踪的文件;cut -c4-
删除每行的前3个字符,仅给出未跟踪文件的相对路径;|
符号是pipes,该符号将前一个命令的输出传递到下一个命令的输入中;>>
和>
符号是redirect operators,它们将前一个命令的输出追加到一个文件中或覆盖/创建新文件。另一种变体,适用于那些更喜欢使用sed
而不是grep
和cut
的人,这里有另一种方法:
git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
cut -c4-
命令会删除每一行的前四个字符,这样我们就只得到了未被跟踪文件的相对路径。其中-c
标记表示要裁剪的列数,而4-
则选择从第四列到末尾的所有内容,因此将删除第1到3列。因此,您的cut命令实际上会删除每行的前三个字符。如果您从git状态行中删除4个字符,例如这个文件的状态行: ?? app/views/static_pages/contact.html.erb
,您将删除app
的第一个字母。因此,该命令是正确的,但解释有误。 - 7studgit status --porcelain | sed -n -e 's,^?? ,/,p' >> .gitignore
- Diego如果您想永久忽略这些文件,添加到 .gitignore
的简单方法是:
git ls-files --others --exclude-standard >> .gitignore
这将枚举所有未跟踪目录中的文件,可能符合或不符合您的要求。
git config status.showUntrackedFiles no
来实现。 - larsch.gitignore
中,在许多用例中是有效的。 - CervEd我认为比起已接受的答案,以下方法更好:
git config --local status.showUntrackedFiles no
已接受的答案无法处理未在 .gitignore
中列出的新增文件。
以上答案都对我没用。
在我的情况下,我想永久地忽略一个个人配置文件(git status -uno
只在一次使用中有效)。
由于我是团队的一员,所以不能将其添加到.gitignore
中,因为它会被检查进去。
我的解决方案是将其添加到:
.git/info/exclude
这就像是你自己的个人.gitignore
文件。
两种方法:
use the argument -uno
to git-status
. Here's an example:
[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)
Or you can add the files and directories to .gitignore
, in which case they will never show up.
.gitignore
的方法是 git status | cat >> temp && vim temp
。然后编辑文件,删除前几行和最后一行,以及尾随的 #
和其后的空格。然后执行 cat temp >> .gitignore && rm temp
。如果之前没有 .gitignore
,则可以使用 mv temp .gitignore
。虽然不太美观,但比手动更新 .gitignore
要好得多。 - sjas-uno
。如果你使用-u no
,它等同于no -u
- 它将对一个名为no
的文件执行状态(该文件可能不存在),并使用默认的-u
模式。也就是说,它相当于git status no
。 - Aaron McDaid-u no
也不显示未暂存的文件。使用 -uno
可以如愿以偿地显示未暂存的文件,但隐藏未跟踪的文件。
git status -u X
等同于 git status X -u
(X
不是 -u
的参数)。这又等同于 git status X
(因为没有参数的 -u
是默认的 -u
)。因此,它仅仅是在文件 X
上执行了一次 git-status。因此,如果 X
是 no
,它只是试图在一个名为 no
的文件上执行 git status,而您可能没有这个文件。 - Aaron McDaid如果您的操作系统不是类Unix操作系统,那么可以使用PowerShell在Windows上运行此命令:
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
gitignore
”它们全部,注意自git 1.8.3 (April, 22d 2013)以来,即使您没有添加该选项,git status
也会提到--untracked-files=no
!git status
"建议用户在执行时间过长时考虑使用--untracked=no
选项。git reset --hard HEAD
git clean -fxd
将会删除所有未被跟踪的文件,并使您的本地分支与远程分支保持最新状态。如果您不想保留已经进行的任何本地更改,这是一个好的选择。
*
很可能不是您想要的。 - sjas-u no
是错误的。-uno
是正确的。-u no
尝试对名为no
的文件执行状态操作!no
不是-u
的参数。要强制将no
解释为-u
的参数,就不能有空格。要测试这一点,请执行touch Invalid
并比较git status -uInvalid
和git status -u Invalid
。 - Aaron McDaid-uno
的no
应该是-u
的参数,因此认为 Git 的选项解析存在问题是合理的。从历史上看,通常带有参数的选项允许它们之间有空格。 - Mr. Lance E Sloan