.gitignore不会忽略tfvars和.terraform目录。

3

看起来我的 .gitignore 文件不像预期的那样正确。

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   .gitignore
        new file:   win_2016_datacentre_vm/.terraform/plugins/linux_amd64/lock.json
        new file:   win_2016_datacentre_vm/.terraform/plugins/linux_amd64/terraform-provider-azurerm_v1.16.0_x4
        new file:   win_2016_datacentre_vm/aos-1.tfvars
        new file:   win_2016_datacentre_vm/aos-1.v1/.terraform/plugins/linux_amd64/lock.json
        new file:   win_2016_datacentre_vm/aos-1.v1/.terraform/plugins/linux_amd64/terraform-provider-azurerm_v1.16.0_x4
        new file:   win_2016_datacentre_vm/aos-1.v1/aos-1.plan
        new file:   win_2016_datacentre_vm/aos-1.v1/aos-1.tf
        new file:   win_2016_datacentre_vm/aos-1.v1/aos-1.tfvars
        new file:   win_2016_datacentre_vm/aos-1.v1/terraform.tfstate
        new file:   win_2016_datacentre_vm/aos-1.v1/terraform.tfstate.backup


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   .gitignore

$ cat .gitignore
# Local terraform directories
docker/*
terraform-getting-started/*
terraform-getting-started.zip
**/.terraform/**
*/**/.tfvars
*.tfstate

让我感到惊奇的是,尽管我已经添加了 .terraform、*.tfvars 和 *.tfstate,为什么还会在 git status 中报告它们?

另外,我应该将 tfstate 提交到存储库中吗?

非常感谢您的帮助。

谢谢


1
你已经将它们分阶段了。 - zerkms
1个回答

6

稍微解释一下zerkms的评论,这一行代码:

Changes to be committed:

告诉你(和我们)你已经告诉Git:请包括这些文件
文件名.gitignore有点误导人。它似乎是一个文件列表,或者是文件名的模式,Git不应该包含,但事实并非如此:相反,它是一个文件名列表,如果它们还没有在那里(但它们已经在那里),Git不应该自动添加,也不应该建议您<强>应该添加

更长,但需要了解

Git的模型是,Git从Git称之为索引暂存区域缓存的内容中构建新的提交,具体取决于调用方/ Git的哪个部分正在进行调用。我知道的最好的索引短描述是,它是Git构建下一个要做的提交的地方(或在这种情况下,第一个要做的提交)。
当您首次检出某个现有的提交时——您目前还不能这样做,因为还没有任何提交,但在将来的某个时间,当您使用git checkoutgit clone运行git checkout时,Git将从该提交中填充索引,并使用从提交中提取的索引内容来填充工作树。现在,索引副本和工作树副本都匹配,并且它们两个都与从提交中取出的文件匹配。
当您有一个完整的文件工作树并更改其中一些文件时,您运行git add将现有的工作树文件重新复制回索引,以使它们准备好下一个提交。现在,索引副本和工作树副本再次匹配,并且两者都与仍在提交中的文件不同。(或者,如果该文件是全新的,则现在在索引中,而之前没有。)
当您进行新的提交时,Git会冻结在索引中的副本,并将其放入提交中。索引中的内容现在在新提交中,现在是当前提交。因此,现在索引与提交匹配,就像您刚检出该提交一样。如果所有索引文件都与所有工作树文件匹配,则每个文件的所有三个副本都匹配,就像您首次检出提交时一样。
要从索引中删除文件,使用 git rm:这将从索引和工作树中都删除。如果只想从索引中删除它并保留在工作树中,请改用 git rm --cached 。请注意:如果该文件存在于某些现有提交中,并且您将其从索引中删除,则它将不会出现在您制作的新提交中,但它仍将存在于现有提交中。检出其中一个提交将会覆盖你故意留下的工作树文件,可以使用 git rm --cached来避免。

这是一个更好的措辞,我把我的回答删掉了,支持这个答案。 - zerkms
@zerkms:我们有点比赛回答 :-)(我认为你的评论很可能是你要说的全部内容) - torek
我最初只是想留下一条评论,但后来决定获得更多的简单声望分数! :-D - zerkms
感谢你们两位的回复。如果有误导,那么应该进行教育,而不是责怪任何人。现在你的评论是:
这是一个文件名列表,Git 不会自动添加它们(但它们已经存在),也不会建议你添加。 你认为它们已经存在,但我在 git status 中没有看到在 .gitignore 中的文件/目录。
- learner
git status 命令会比较你的索引与当前提交的内容,或者在这种情况下,与“没有文件”的内容进行比较,并告诉你每个新文件都是一个“待提交”的新文件。在将它们列入 .gitignore 之前,你已经将它们添加到了索引中。要直接查看索引中的内容,请使用 git ls-files 命令,但通常只有在调试时才有用。 - torek
谢谢你,torek :) - learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接