考虑如下场景:

外部依赖从仓库中拉取编译结果(即源码的产出),而产出放在源码中跟随源码一起进行版本管理又不太科学,主要体现在:

  • 本地不但要提交源码,还要手动运行编译命令更新产出,将源码及产出一起提交
  • 合并代码时,产出部分的冲突其实可以忽略,但还是得在合并时进行处理,这是个重复且冗余的工作

所以正确的做法应该是将构建产出的操作放到持续集成中,这解决了本地手动构建的重复动作。

而产出本身应该排除在版本管理之外,仓库理论上只管理源码即可,这样解决了合并时解决冲突的问题。

假设产出目录为 dist,将其添加到 .gitignore 以从版本管理中忽略:

+ dist

但由于前面描述的原因,外部一些地方依赖于从仓库拉取产出,所以持续集成中构建产出的产出文件,还应该提交到仓库。

通过 git add -f dist 可以将前面已经配置了忽略的产出目录 dist 强行添加到提交变更中。

然后就可以在持续集成中将产出提交至远端仓库了。

这样做到了本地只有源码,远端始终包含最新源码对应的产出供其他地方拉取使用。

git push -f

针对被 .gitignore 忽略的文件,对其执行git add 会报错误:

$ git add dist/foo.js
The following paths are ignored by one of your .gitignore files:
dist/foo.js
hint: Use -f if you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"

通过提示可知如果仍然想要添加到变更并提交,可加上 -f 参数,亦即 git add -f

但有个致命的问题,通过 -f 提交的文件会再次回到版本管理范围内,即本地拉取到之后,对这些文件进行的变更会被包含进来。

相关资源