【问题标题】:Need GIT workflow suggestion需要 GIT 工作流程建议
【发布时间】:2010-06-22 08:48:05
【问题描述】:

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

然后是我的文件;

正如我所说,这是一种专有的脚本语言,在代码本身中,您可以找到有关配置(服务器、数据库和其他东西)的标签。我知道这听起来可能很奇怪,但从技术上讲,这段代码一个大而复杂的配置文件。嗯,改不了了,暂且不管吧。

我也有两个不同的环境:devprod,我猜它的用途很明显。由于代码被认为很奇怪,如果您将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 之类的东西,我将在那里完成工作。不幸的是,我还没有做到这一点。

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

  1. 初始化回购proj1
  2. 复制prod文件
  3. 首先添加/提交
  4. $ git checkout -b dev
  5. 配置dev设置
  6. 代码/提交开发周期
  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'

嗯……不好。

有人对更实用的工作流程或其他命令有帮助吗?

非常感谢,

f.

【问题讨论】:

    标签: git merge workflow


    【解决方案1】:

    这是典型的“配置文件”情况(即使您的文件不是完全配置文件)。

    usual solution 是:

    • 在代码中只输入变量名
    • 在各自的文件中提取特定于每个环境的值
    • 版本一个能够生成实际代码的脚本(根据当前环境,变量名称已被替换为它们的值)
    • 设置filter driver(参见Git ProBook)来自动进行变量替换(这意味着不会创建“新文件”:仅在git checkout 上修改当前代码——变量被值替换——和“在git commit 上清理”——值被变量替换,如果值被修改,则将值放回单独的配置文件中)

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

    只是:

    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
    

    【讨论】:

    • 谢谢!嗯,这比我想象的要复杂一些,但应该这样做。我会试一试,告诉它进展如何。不过,只是想到了一些事情:无论如何我可以告诉 GIT 如何合并二进制文件吗?假设..我有一个 OpenOfficeMerger.exe 能够与 OO 的文件进行三向合并...我可以在任何地方定义它吗? Coruse 是我编的,但如果我可以使用自定义合并……嗯……那将是一条出路:) 谢谢,f.
    • @flpgdt 您可以拥有简单的合并驱动程序 (stackoverflow.com/questions/2920594/…) 或更复杂的合并驱动程序 (stackoverflow.com/questions/2089560/…)
    • 差不多了,使用驱动程序的想法似乎更适合我的需要(尽管我同意字符串扩展更优雅)。我已对问题添加了更新,感谢您的想法:) 谢谢!
    • @flpgdt:似乎最好回滚您的编辑并将“合并驱动程序”作为一个单独的问题:现在我的回答与您的问题无关! ;)
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2023-03-12
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多