Git 忽略无效

Git Ignore not working

这是我的场景。我在分支 A 上,对本地工作副本上的某些文件进行了一些更改。

/launcher/file.esb

我基本上想要以下内容:

  1. 完全忽略对此文件所做的更改。我完成了这个使用 假设不变
  2. 从版本控制中取消跟踪此文件,我试图使用 .gitignore 来完成。

  3. 在我检出不同的分支时,将对此文件的更改保留在我的本地工作文件夹中。 A->开发->B->C 等等...

#3 我无法完成。一旦我签出一个新分支并进行拉取,文件中的旧更改就会被覆盖。

为什么会这样?将此文件路径包含到 .gitignore 中不应该有效地将此文件完全移出版本控制触角吗?

我怎样才能达到#3?

此问题与 "possible duplicate" link 中提到的问题不同。 原因如下:

这基本上就是我想要的通俗语言。 "Put this one particular file of mine in essentially a 'shell', that neither gets overwritten during ANY git operations nor gets taken into account if changed"。它基本上排除了该文件和 staging/remote 之间任何形式的版本控制同步。此本地文件和 staging/remote 上的版本必须相互断开连接。

发生这种情况是因为该文件已经是存储库的一部分。因此,当您切换分支时,您会从正在签出的分支中获取该文件的版本。 gitignore 文件只会阻止 git 查看不属于存储库的文件。这已经完成,因此 git 不会在 git add .git commit -a 等命令中包含某些文件。并且 assume-unchanged 选项欺骗 git 看不到更改,但这意味着 Git 可以在结帐时随意覆盖文件,因为它知道文件与提交的版本没有区别。

如果您想要从 git 控制中删除此文件并自行管理对其所做的更改,您可以使用 git rm --cached /launcher/file.esb 并提交更改。这将从索引中删除该文件,git 将不再跟踪该文件。 --cached 选项阻止 git 从您的工作目录中实际删除文件。不过,您可能必须为每个分支单独执行此操作,因为从一个分支中删除文件不会将其从其他分支中删除。为此,您可能需要撤消 assume-unchanged 然后使用 git stash 命令临时存储您的本地更改。

Untrack this file from version control, which I tried to accomplish using .gitignore.

你尝试过但失败了。 .gitignore 在更新索引时只读,即准备下一次提交。如果文件已经提交,将其添加到 .gitignore 无助于告诉 Git 停止跟踪文件。

您还必须从索引中删除(使用 [git rm --cached](https://git-scm.com/docs/git-rm))并提交更改。只有这样 Git 才会停止跟踪文件。将其名称添加到 .gitignore 只会告诉它停止在 git status.

输出的 Untracked files 部分中列出它

但是,如果您检出在从存储库中删除文件之前创建的提交,则该提交包含该文件,Git 也会尝试检出它。