有没有一种方便的方法可以忽略 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
这将创建一个子shell,该子shell在创建文件之前完成。.gitignore
命令解释因为我得到了很多选票(谢谢!)我想我最好解释一下命令:
git status --porcelain
使用而不是git status --short
因为手动状态“以易于解析的格式为脚本提供输出。这类似于简短的输出,但在 git 版本之间以及无论用户配置如何都将保持稳定。” 所以我们兼具可解析性和稳定性;grep '^??'
仅过滤以 开头的行??
,根据git status 手册,这些行对应于未跟踪的文件;cut -c4-
删除每行的前 3 个字符,这只是为我们提供了未跟踪文件的相对路径;|
符号是管道,它将上一个命令的输出传递给下一个命令的输入;>>
,它们分别将上一个命令的输出附加到文件或覆盖/创建新文件。>
对于那些喜欢使用sed
而不是grep
and的人的另cut
一种变体,这是另一种方式:
git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore
如果您想永久忽略这些文件,添加它们的简单方法.gitignore
是:
git ls-files --others --exclude-standard >> .gitignore
这将枚举未跟踪目录中的所有文件,这可能是也可能不是您想要的。
恕我直言,比公认的答案更好的是使用以下内容:
git config --local status.showUntrackedFiles no
接受的答案不适用于添加不在其中的新文件时.gitignore
两种方式:
使用参数-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)
或者您可以将文件和目录添加到.gitignore
,在这种情况下它们将永远不会出现。
-u no
也不显示未暂存的文件。 -uno
按需要工作并显示未上演,但隐藏未跟踪。
如果您不在 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
如果您有很多未跟踪的文件,并且不想“ gitignore
”所有这些文件,请注意,从git 1.8.3 (April, 22d 2013) 开始,即使您没有在第一名!git status
--untracked-files=no
"
git status
" 建议用户--untracked=no
在时间过长时考虑使用选项。
我来这里是为了解决一个稍微不同的问题。也许这对其他人有用:
我创建了一个新分支feature-a
。作为这个分支的一部分,我创建了新目录,并且需要修改 .gitignore 来抑制其中的一些。在将新工具添加到创建各种缓存文件夹的项目中时,这种情况经常发生。 .serverless
,.terraform
等。
在我准备好将它合并回 master 之前,我还有其他东西出现,所以我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"