我正在研究具有Doctrine 2依赖项的Zend Framework 2项目。源版本控制由 GIT 处理。我们使用 GitFlow 作为分支模型。
问题情况:
Migrations on Develop branch:
001.php
002.php
003.php
004.php
Migrations on Production branch:
001.php
002.php
假设我需要修补并在生产分支上创建迁移 003.php。我还必须挑选 003.php 更改为 Development 分支,最终结果如下所示:
Migrations on Develop branch:
001.php
002.php
*003.php*
003.php
004.php
Migrations on Production branch:
001.php
002.php
*003.php*
但问题来了。如果修改照片数据库上的当前迁移是 004 并且添加了 003,则不会执行它。
处理教义 2 迁移的最佳方法是什么?
我还在使用 ZF2、Doctrine 2 和 Migrations 以及 Gitflow 作为分支模型进行项目。因此,我们对位于不同分支中的迁移有相同的问题。发生此问题时,我使用原则迁移工具手动处理它以同步迁移版本:
$php public/index.php migrations:version 20150417121714 --add
$php public/index.php migrations:version 20150417202439 --remove
然后:
$php public/index.php migrations:execute 20150417121714
这个解决方案需要一些手动工作,但不幸的是,到目前为止我没有更好的。
我编写了一个脚本来自动迁移回当前分支中的所有不同迁移并迁移回您正在签出的新分支的过程。
上面的链接是针对 Symfony,但这里它针对 ZF2 进行了修改(未经测试,因为我不使用 ZF2):
doctrine-checkout.sh
#!/bin/bash
# Commit ref of current HEAD
start_commit="$(git rev-parse HEAD)"
# Commit ref of what is to be checked out
dest_commit="$1"
# First common ancestor commit between the two branches
ancestor="$(git merge-base HEAD "$dest_commit")"
# Shorthand for `sudo -u nginx /home/user/project/public/index.php`
# Modify this if you don't run `php public/index.php` as `nginx`
appconsole="sudo -u nginx php $(git rev-parse --show-toplevel)/public/index.php"
# Checkout the ancestor commit to find the first common migration between the
# two branches. Migrate backwards to this version.
git checkout "$ancestor"
ancestor_migration="$($appconsole migrations:latest)"
git checkout "$start_commit"
$appconsole migrations:migrate "$ancestor_migration"
# Checkout the destination branch and migrate back up
git checkout "$dest_commit"
$appconsole migrations:migrate
要使用它,当您需要在功能分支之间切换时,而不是运行git checkout another-branch
,请doctrine-checkout.sh another-branch
。
变基,以便它们包含以前在另一个分支中的迁移的提交,这将导致难以从另一个分支再次签出该分支,因为它可能在分支添加的迁移后面进行了最近日期的迁移。 您可以在功能分支中git rebase -i
并edit
提交,在这种情况下,提交会添加迁移以重命名迁移。