【发布时间】:2010-06-22 08:48:05
【问题描述】:
过去几周我一直在研究 GIT,试图控制我团队的代码。 不幸的是,我们使用的代码是一种专有语言,具有一些特性,这使我无法找到足够实用的工作流程来实现。不过,我可能并不了解 GIT 的所有功能,所以我向你们寻求建议。我将这篇文章分为三部分:1)我的文件怎么样; 2)到目前为止我们已经想到的工作流程; 3)我认为未来的选择。
然后是我的文件;
正如我所说,这是一种专有的脚本语言,在代码本身中,您可以找到有关配置(服务器、数据库和其他东西)的标签。我知道这听起来可能很奇怪,但从技术上讲,这段代码是一个大而复杂的配置文件。嗯,改不了了,暂且不管吧。
我也有两个不同的环境:dev 和prod,我猜它的用途很明显。由于代码被认为很奇怪,如果您将dev 中的脚本与prod 中的相同脚本进行比较,您会看到:
产品:
CodeCode += Code(0)
Code{1} ...
CodeConfig = "ConnectionToProducionDB"
SomeMoreGenericCode.doSomething()
(...)
在 dev 中它看起来像:
CodeCode += Code(0)
Code{1} ...
CodeConfig = "GoToSomeDevDB"
SomeMoreGenericCode.doSomething()
(...)
关于文件就是这样。
现在,我们想到了什么;
乍一看,对我来说,这似乎是一个经典的让分支情况,所以我已经完成了。
[create a folder and init it]
[copy my code from production and add/commit it]
$ git checkout -b dev
[change these lines with 'CodeConfig' to the dev settings]
[go happy coding and commiting]
一段时间后,编码和测试完成,是时候合并到生产中了。这就是问题开始的时候。
一个简单的git merge dev(来自我的主分支)将大部分代码合并,但配置也会转移到主分支,因为从 GIT 的 POV 来看,这是代码本身的更新之一。虽然在这个简短的代码中这不是问题,但在实际情况下,我可能已经重新配置了十或二十个源并且一次回滚一个并不是一件令人愉快(也不可靠)的任务。
当然,在使用分支时,我确实希望能够合并我的代码以保留我的提交历史记录和 cmets。我只需要以更个性化的方式完成它...
我尝试了几种不同的方法来解决这个问题,但都没有成功。似乎 GIT 的合并对我来说太聪明了:(
例如,将*.xml merge=Unset 放入我的.gitattributes 文件中。或者自定义合并驱动程序到 ~/.gitconfig 试图导致自动合并失败(虽然不确定我是否正确)。
我认为可能的解决方案;
正如我所说,我可能不了解 GIT 的所有功能,所以我的选择受限于我所知道的那些。我很欣赏你的创新;)
虽然最简单的方法是如果我可以禁用任何自动合并并手动完成所有操作(代码不是那么大,无论如何我都必须研究它)。之后,我将创建一个简单的合并驱动程序,它将所有代码更改(不仅是冲突)传递给诸如 WinMerge 或 Kdiff3 之类的东西,我将在那里完成工作。不幸的是,我还没有做到这一点。
我的最后一次尝试导致了一个冗长且不切实际的工作流程,但我会在这里写下来,以便您了解我的目标。
- 初始化回购
proj1 - 复制
prod文件 - 首先添加/提交
$ git checkout -b dev- 配置
dev设置 - 代码/提交开发周期
- 将开发文件复制到
tmpDevDir $ git checkout master- 使用 WinMerge 将
tmpDevDir与proj1[master branch]进行比较并仅应用所需的更改 - 提交
proj1[master branch] $ git merge dev- 根据需要合并冲突
-
$ git diff HEAD HEAD^查看合并结果并恢复合并的配置 $ git commit -am 'final commit for the production code'
嗯……不好。
有人对更实用的工作流程或其他命令有帮助吗?
非常感谢,
f.
【问题讨论】: