`git update-index --skip-worktree`之后`你对以下文件的本地更改将被checkout覆盖`

Posted

技术标签:

【中文标题】`git update-index --skip-worktree`之后`你对以下文件的本地更改将被checkout覆盖`【英文标题】:`Your local changes to the following files would be overwritten by checkout` After `git update-index --skip-worktree` 【发布时间】:2021-12-24 15:06:48 【问题描述】:

我需要更改本地远程存储库中的文件,并在我执行git commit/git push 时让 git 忽略这些更改。

已经有答案了:https://***.com/a/1753078/747050https://***.com/a/13631525/747050 他们都告诉使用

git update-index --skip-worktree <file-name>

当我执行此命令并更改文件,然后切换分支git switch master 时出现错误:

error: Your local changes to the following files would be overwritten by checkout:
        <file-name>
Please commit your changes or stash them before you switch branches.

编辑.git/info/exclude 文件和git update-index --assume-unchanged 都无济于事。

【问题讨论】:

提交的时候不加就行了? 当您正在切换的分支之间的文件不相同时会发生这种情况。问题是:您期望会发生什么? 只要 git 正在跟踪该文件,git 就希望继续跟踪对该文件的修改。正确避免这种情况的唯一方法是从存储库中删除文件并将适当的过滤器添加到 gitignore。正如您已经观察到的那样,让 git 假装文件没有更改之类的骇人听闻的解决方案存在缺陷,并且没有简单的方法可以避免这种情况。这很难做到正确的原因是普遍的共识是,首先这是错误的事情,所以没有添加好的解决方案。 您应该考虑将存储库中需要执行此操作的文件重命名为模板文件,然后让开发人员将其复制到您的应用程序将使用的文件并更改这个文件,但是这个文件会被 git 忽略。 @1615903,啊,对,我确信 X 和 Y 是相同的,但它们不是。一旦我合并了分支并使它们成为相同的跳过工作树,就可以正常工作而不会出现错误。非常感谢!如果你做出回答,我会接受。 【参考方案1】:

您有一个分支 A,其中文件的内容为 X,分支 B 的内容为 Y,然后您对已使用 skip-worktree 忽略的文件进行了一些本地更改 Z。当从分支 A 切换到 B 时,git 应该如何知道文件之后的样子?它应该看起来像 Z、Y,还是应该从 X 和 Z 中提取一些变更集,并将其应用于 Y?

skip-worktree在文件跟踪内容相同的情况下工作得相当好,但是当存在差异时,您需要在切换分支时手动工作。

【讨论】:

以上是关于`git update-index --skip-worktree`之后`你对以下文件的本地更改将被checkout覆盖`的主要内容,如果未能解决你的问题,请参考以下文章

git update-index --assume-unchanged忽略跟踪

git update-index --assume-unchanged

git update-index --assume-unchanged 对目录

自动将“git update-index --chmod=+x”应用于可执行文件

git rebase之abort,continue,skip

找回git rebase --skip消失的代码