我有一个git问题,答案应该在stackoverflow上的某处,但我找不到它。
想象一个团队在使用sass或其他一些构建文件的某个项目上工作。多个开发人员构建文件,我们希望对构建的文件进行版本控制,以防非开发人员想要克隆并检查项目而无需先构建。
但是在项目中包含已构建的文件会一直产生合并冲突。
我们可以忽略本地更改,只让主要开发人员不时检查他的版本。
可以使用用户定义的.gitignore文件或使用:
进行忽略$ git update-index --assume-unchanged path-to-file.css
但这在拉动时会产生问题。
$ git pull
remote: Counting objects: 30, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 16 (delta 11), reused 16 (delta 11)
Unpacking objects: 100% (16/16), done.
From github.com:User/MyProject
4e1s389..a231344 development -> origin/master
Updating 63sdf04..a231344
error: Your local changes to 'path-to-file.css' would be overwritten by merge.
Aborting.
Please, commit your changes or stash them before you can merge.
解决方法是一直检出文件,例如使用别名:
git config --global alias.cobuilded 'checkout path-to-file.css'
然后经过一些工作和建设:
git cobuilded
git commit -am "work done"
git pull
git push
但是对于这个问题应该有一些更简单的解决方案吗?
git ignore-this-file-and-always-merge-theirs-from-origin path-to-file.css
我已经找到了this的问题和一个可能的解决方案,以便始终合并他们。但在我的情况下,合并之前的拉动已经失败了......
答案 0 :(得分:1)
通常这是一个很好的理念: 请勿签入生成的文件。
相反,提供一个发布区域 - 或者更一般地说 - 提供一种发布机制来满足您的客户(也就是消费团队)。
一般来说,您正在寻找部署系统,而不是版本控制系统。但是你可以将两者结合起来。 git不是部署系统。虽然可以肯定它可以走很长的路,但是这个方向有一些扩展,我本人有时为了方便而故意误用它。
一种方法是使用每次在某个分支上发生提交(或推送)时触发的自动构建系统。有可用的“持续集成”工具的开源工具。 Git提供钩子来触发例如动作。推进回购:$GIT_DIR/hooks/post-receive
。这是一个非常好的example for sending emails,可以修改为export a release to a filesystem area。之后,您可以在该区域触发构建过程。
或者,您可以修改现有构建过程以包含最终构建目标。这个会将构建目录的副本导出到发布区域。应该手动触发目标,并且只有在测试通过时才会触发。
您的项目可能包含一个版本控制文件,称为“物料清单”(例如“release.bom”),它列出了发布时应复制到发布区域的所有文件(具有相对路径)。这样你就可以避免意外地将释放区域与那些没有人感兴趣的对象或临时文件混为一起。
如果仅供其他团队内部使用,可能只需一个简单的rsync,可选择--exclude-from=FILE
选项和git控制下的排除配置文件即可。搜索“rsync过滤规则”以获取有关其语法的更多信息。