忽略对跟踪文件的更改

Ignore changes to a tracked file

我想更改一个仅用于开发的跟踪文件,但保持跟踪版本不变。

大多数"solutions" 对此建议

git update-index --assume-unchanged

但这完全没用,因为文件仍然会被检出或重置更改。是否有更好的解决方案可以在结帐和重置命令中幸存下来?

由于在您的评论之一中您直接在 master 分支中工作,因此真正要解决的问题是在 master.

中工作

您需要在 Git 中创建主题分支:

git checkout -b some_feature_or_bug_fix master

然后对配置文件进行必要的更改,然后正常提交。

这里的好处是您不会影响 master 中的文件。如果您需要引入更新的代码,只需 git fetchgit merge origin/master 到您的主题分支。然后,您可以像正常 Git 合并一样处理配置文件的上游更改。

在将您的主题分支合并到 master 之前,您可以进行交互式压缩以减少提交并将提交合并为一个漂亮、干净的提交。或者执行 git merge --squash 将您的主题分支合并到 master.

快速修复

这就是我认为您正在尝试做的,更改文件,但在提交时忽略它。

git update-index --skip-worktree my-file

这里是关于 difference between assume-unchanged and skip-worktree 的一个很好的答案。

如果您尝试将更改合并到 my-file

Git 仍会发出警告。然后你将不得不 "unskip" 文件,合并它并 "re-skip" 它。

git update-index --no-skip-worktree my-file
# merge here
git update-index --skip-worktree my-file

如果您修改文件,然后切换到更改该文件的分支,也可能会出现问题。你可能需要做一些花哨的 "skip/unskip" 操作来解决这个问题。

长期修复

从长远来看,您可能希望将 "local" 更改分离到第二个文件中。例如,如果您要更改的文件是配置文件,请创建一个 "default" 配置文件,然后将其签入存储库。然后,允许第二个 "overrides" 配置文件是可选的,并将该文件放入您的 .gitignore.

然后,在您的应用程序中,读取默认配置文件,然后检查覆盖文件是否存在。如果是,将该数据与默认文件中的数据合并。

此示例适用于配置文件,但如果需要,您可以将该技术用于其他类型的覆盖。