过去几周我一直在研究GIT,试图让我的团队的代码得到控制。 不幸的是,我们使用的代码是一种具有一些特殊性的专有语言,这使我无法找到足够实用的工作流程来实现。尽管如此,我可能还没有意识到GIT的所有功能,所以我向你们提出建议。我将这篇文章分成三篇:1)我的文件是怎样的; 2)到目前为止我们已经想到的工作流程; 3)我认为未来的选择。
然后我的文件;
正如我所说,这是一种专有的脚本语言,在代码本身中你会找到有关配置(服务器,数据库和其他东西)的标签。我知道,这可能听起来很奇怪,但从技术上讲,这段代码 是一个很复杂的配置文件。好吧,它无法改变,现在让我们离开吧。
我还有两种不同的环境:dev
和prod
,我猜它的用途很明显。由于考虑了代码的奇怪方式,如果您将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,我将完成工作。不幸的是,我还没有达到这个目的。
我的最后一次尝试导致了一个冗长且不切实际的工作流程,但我会在这里写下来,这样你就可以了解我的目标。
proj1
prod
个文件$ git checkout -b dev
dev
设置tmpDevDir
$ git checkout master
tmpDevDir
与proj1[master branch]
进行比较并仅应用所需的更改proj1[master branch]
$ git merge dev
$ git diff HEAD HEAD^
审核合并结果并还原合并后的配置$ git commit -am 'final commit for the production code'
嗯......不太好。
有人会有更实际的工作流程或其他命令的想法,这将有助于此吗?
非常感谢,
F。
答案 0 :(得分:4)
这是一个经典的“配置文件”情况(即使你的文件不是完全配置文件)。
git checkout
上修改当前代码 - 变量由值{ - 和git commit
上的“已清除” - 由变量替换的值,如果已修改,则将值放回单独的配置文件中)
这样,您不必仅仅因为某些文件中有单独的值而创建单独的分支 没有复杂的合并,在分支之间复制等等。
只需:
yourCode1.code
yourCode2.code
...
yourCoden.code
devValues.txt
prodValues.txt
scriptPutValuesInCode.sh
scriptCleanCodeFromValues.sh
*.code filter=setOrCleanValues
git config --global filter.setOrCleanValues.smudge /path/to/scriptPutValuesInCode.sh
git config --global filter.setOrCleanValues.clean /path/to/scriptCleanCodeFromValues.sh