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

时间:2012-07-18 13:35:40

标签: git gitignore

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

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

9 个答案:

答案 0 :(得分:235)

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

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,在创建.gitignore文件之前完成

命令解释,因为我获得了很多选票(谢谢!)我想我能更好地解释一下这个命令:

  • git status --porcelain代替git status --short,因为manual表示"以易于解析的格式为脚本提供输出。这类似于短输出,但在git版本中保持稳定,无论用户配置如何。"所以我们既有可解析性又有稳定性;
  • grep '^??'仅过滤以??开头的行,根据git status manual,这些行对应于未跟踪的文件;
  • cut -c4-删除每行的前3个字符,这只给出了未跟踪文件的相对路径;
  • |符号为pipes,它将上一个命令的输出传递给以下命令的输入;
  • >>>符号为redirect operators,它们将上一个命令的输出附加到文件或分别覆盖/创建新文件。
对于那些喜欢using sed而不是grepcut的人来说,

另一个变体,这是另一种方式:

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

答案 1 :(得分:43)

如果您想永久忽略这些文件,将其添加到.gitignore的简单方法是:

  1. 更改为git树的根目录。
  2. git ls-files --others --exclude-standard >> .gitignore
  3. 这将枚举未跟踪目录中的所有文件,这些文件可能是您想要的,也可能不是。

答案 2 :(得分:13)

the manual

中找到它

git status -uno

答案 3 :(得分:4)

-u no也未显示未暂存的文件。 -uno按预期工作,显示未分阶段,但未隐藏。

答案 4 :(得分:3)

两种方式:

使用参数" -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)

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

答案 5 :(得分:3)

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

git config --local status.showUntrackedFiles no

接受的答案不适用于添加不在 .gitignore 中的新文件

答案 6 :(得分:2)

如果您不在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

答案 7 :(得分:1)

如果您有很多未跟踪的文件,并且不想“gitignore”所有文件,请注意,自git 1.8.3 (April, 22d 2013),{{1}即使你没有首先添加该选项,也会提到git status

  

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

答案 8 :(得分:0)

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

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

在我准备将其合并回master之前,我还有其他事情,因此我再次结帐master,但是现在git status再次拾取了那些被禁止的文件夹,因为.gitignore已经还没有被合并。

这里的答案实际上很简单,尽管我必须找到this blog来找出答案:

只需从feature-a分支中检出.gitignore文件

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"