.gitignore 在我更改文件后不会忽略我的文件

.gitignore doesn't ignore my files after I changed them

我有一堆文件不应该受版本控制。但是,如果我不将它们置于版本控制之下,那么我的构建就会失败。由于这些文件包含 key/value 内容,我添加了这些文件,但用假值替换了实际值。因此,我能够让我的构建通过,而且我没有 VC 下的那些实际 key/value。我将此更改提交到 VC。我还将这些文件的列表放在 .gitignore 文件下,如下所示:

/app/src/main/assets/*.json
/app/src/main/assets/*.kt

现在的问题是,为了测试我的更改,我需要用真实的 files/values 替换那些假的。但是,通过这样做,当我 运行 git status.

时,我会在已更改文件列表中获取这些文件

我明明是在.gitignore下面加的,怎么又在这里看到了?这是我看到的:

hesam(dev)$ git status
On branch dev
Your branch is up to date with 'origin/dev'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   app/src/main/assets/EmergencyContacts.json
    modified:   app/src/main/assets/LocationOfSites.json
    modified:   app/src/main/assets/LocationOfHospitals.json
    modified:   app/src/main/assets/LocationOfOffices.json

您确定将 .gitignore 文件放在正确的目录中吗?您应该将 .gitignore 放在工作目录中,而不是放在 .git (存储库)目录中

问题的根源在于不能忽略当前跟踪的文件。

不幸的是,解决这个问题需要从索引/暂存区中删除文件(这样它们就不会被跟踪),这反过来意味着Git将从工作树中删除 文件。您可以使用 git rm --cached 禁止立即删除此类文件,但将来,任何返回 包含 文件的任何现有提交的任何人都将把这些文件放入他们的index/staging-area 和他们的工作树,然后从该提交移回当前提交( 没有 文件)意味着 Git 将删除文件。

也就是说,任何时候你 git checkout 一个 文件的提交,它们都会进入你的 index/staging-area (这是两个名称的一个东西)和你的工作树(这是你可以看到和使用你的文件的地方)。任何时候你从签出这种提交,文件,到任何没有有文件的提交,Git 将从索引和工作树中删除文件。因此,这些文件在任何 历史 有效提交中的存在 "poisons" 存储库。

这个问题的唯一完整的解决方案是永远不要首先提交文件。这要求您及时返回并阻止自己提交文件。这个解决方案的一个近似是重写提交历史,以便没有剩余的提交有文件:消除所有 did 有文件的提交,也许插入新的和改进的替换提交没有 文件。查看 How to make Git "forget" about a file that was tracked but is now in .gitignore?

的许多答案中的一些

此解决方案的缺点是您不能在提交中包含示例原型文件。这个缺点的解决方案是将示例原型文件放在您的提交中 但在一些其他文件名下 :

I have a bunch of files that should not be under version control. However, if I don't bring them under version control then my build fails. As those files contain key/value content, I added those files in but replaced the actual values with a fake value.

让您的构建过程使用备用(样本文件)文件而不是真实文件,用于测试构建。

软件用户使用的是真实文件,不受版本控制。测试版本的用户将使用测试文件,受版本控制。