需要GIT工作流程建议

时间:2010-06-22 08:48:06

标签: git merge workflow

过去几周我一直在研究GIT,试图让我的团队的代码得到控制。 不幸的是,我们使用的代码是一种具有一些特殊性的专有语言,这使我无法找到足够实用的工作流程来实现。尽管如此,我可能还没有意识到GIT的所有功能,所以我向你们提出建议。我将这篇文章分成三篇:1)我的文件是怎样的; 2)到目前为止我们已经想到的工作流程; 3)我认为未来的选择。

然后

我的文件;

正如我所说,这是一种专有的脚本语言,在代码本身中你会找到有关配置(服务器,数据库和其他东西)的标签。我知道,这可能听起来很奇怪,但从技术上讲,这段代码 是一个很复杂的配置文件。好吧,它无法改变,现在让我们离开吧。

我还有两种不同的环境:devprod,我猜它的用途很明显。由于考虑了代码的奇怪方式,如果您将dev中的脚本与prod中的同一个脚本进行比较,您会看到:

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,这是代码本身的更新之一。虽然在这个简短的代码中它不会是一个问题,但在实际情况下,我可能已经重新配置了十二个或二十个源,并且在时间上回滚一个并不是一个令人愉快(也不可靠)的任务。

当然,在使用分支时,我确实希望能够合并我的代码以保留我的提交历史记录和注释。我只需要以更加个性化的方式完成它......

我尝试了几种不同的方法来解决这个问题,但没有成功。似乎GIT的合并对我来说太聪明了:(

例如,*.xml merge=Unset到我的.gitattributes文件中。或者~~ .gitconfig中的自定义合并驱动程序试图导致自动合并失败(不确定我是否正确)。

我认为可能的解决方案;

正如我所说,我可能不知道所有GIT的功能,所以我的选择受到我所知道的人的约束。我感谢你的创新;)

我虽然最简单的方法是,如果我可以禁用任何自动合并并手动完成(代码不是那么大,我还是要调查它)。之后,我将创建一个简单的合并驱动程序,将所有代码更改(不仅是冲突)传递给WinMerge或Kdiff3,我将完成工作。不幸的是,我还没有达到这个目的。

我的最后一次尝试导致了一个冗长且不切实际的工作流程,但我会在这里写下来,这样你就可以了解我的目标。

  1. init repo proj1
  2. 复制prod个文件
  3. 首先添加/提交
  4. $ git checkout -b dev
  5. 配置dev设置
  6. code / commit dev cycle
  7. 将开发文件复制到tmpDevDir
  8. $ git checkout master
  9. 使用WinMerge将tmpDevDirproj1[master branch]进行比较并仅应用所需的更改
  10. 提交proj1[master branch]
  11. $ git merge dev
  12. 合并需要的冲突
  13. $ git diff HEAD HEAD^审核合并结果并还原合并后的配置
  14. $ git commit -am 'final commit for the production code'
  15. 嗯......不太好。

    有人会有更实际的工作流程或其他命令的想法,这将有助于此吗?

    非常感谢,

    F。

1 个答案:

答案 0 :(得分:4)

这是一个经典的“配置文件”情况(即使你的文件不是完全配置文件)。

usual solution是:

  • 只在代码中添加变量名称
  • 在自己的文件中提取特定于每个环境的值
  • version脚本能够生成实际代码(变量名称已根据当前环境替换为其值)
  • 设置filter driver(请参阅Git ProBook)以自动执行变量替换(意味着不会创建“新文件”:仅在git checkout上修改当前代码 - 变量由值{ - 和git commit上的“已清除” - 由变量替换的值,如果已修改,则将值放回单独的配置文件中)

alt text

这样,您不必仅仅因为某些文件中有单独的值而创建单独的分支 没有复杂的合并,在分支之间复制等等。

只需:

yourCode1.code
yourCode2.code
...
yourCoden.code
devValues.txt
prodValues.txt
scriptPutValuesInCode.sh
scriptCleanCodeFromValues.sh

filter "smudged clean"

*.code  filter=setOrCleanValues

git config --global filter.setOrCleanValues.smudge /path/to/scriptPutValuesInCode.sh
git config --global filter.setOrCleanValues.clean /path/to/scriptCleanCodeFromValues.sh