如何在 Git 的属性文件中提交和获取部分更改?

How to commit and fetch partial changes inside a properties file in Git?

例如,在存储库中我有一个这样的属性文件:

database.url=https://localhost...
error.message=some message

因此 database.url 等属性用于本地开发环境,永远不应获取或提交。但其他像 error.message 是一般的应用程序配置,确实需要一直获取和提交。

所以每次这个文件改变时,我总是得到这个错误:

error: Your local changes to the following files would be overwritten by checkout:
    config/local.properties

为了解决这个问题,我只是将我的本地配置保存在一个临时文件中,然后我执行 git checkout -- config/local.properties,之后我可以拉取、检出、合并、提交或任何我需要的,然后我可以现在再写我的本地配置。

非常无聊、耗时且容易出错。有更好的方法吗?拆分文件不是一个选项。

如何最好地解决这个问题取决于你的构建工具,但一般原则是本地配置值不应该在你的 repo 中 - 这包括工作树,除非你可以使用 .gitignore 来支持 -步骤它们(其中,因为拆分文件不是一个选项,你不能直接这样做)。

通常这意味着您签出到一个源结构,其中属性文件只是一个模板,其中包含本地定义值的占位符

database.url=$DBURL
error.message=Some message

当然你不能直接运行。您的构建工具将此模板与本地存储的属性文件(位于工作树之外或 .gitignored)相结合,以生成真实的属性文件(其本身也位于 git 工作树,或 .gitignored).

同样有很多变化。如果你已经有一个生成大量新文件的相当大的构建过程(例如 java 项目,或捆绑 and/or 缩小的前端项目等)那么它可能就像拥有一样简单与签入的工作树分开的构建目标目录(例如,根据典型的 Maven 项目结构)。或者,如果您想就地执行工作树,那么您签入的文件可能会命名为 my.properties.template,构建过程可能会生成 my.properties,因此您 .gitignore my.properties .

到目前为止,我发现解决该问题的最佳方法是在结帐或合并之前使用 git stash,然后在结帐或合并之后使用 git stash pop。也许有更好的方法,但我会坚持下去,直到找到更好的解决方案。