Git钩子后合并

3

有没有办法判断合并操作是否与拉取操作相关联?

我想使用 git-flow 的合并操作作为钩子来将我的数据发送到 Heroku。有什么想法吗?


我不明白 - 为什么你特别需要知道合并是由拉取请求引起的结果?毕竟,使用Git Flow模型,您只关心合并是否进入了“master”或其他特定分支,对吧? - Mark Longair
我正在尝试每次合并到主分支时运行一个部署脚本到Heroku,但是我也有一个暂存服务器,并且希望每次合并到开发分支时都能部署到暂存服务器。我们有两个人在协作,我担心每次从源代码库拉取并自动合并到开发分支时,它会再次尝试发布到暂存服务器... - schone
你的意思是说,如果你在development分支上运行git pull origin master,它会部署一个从master合并的版本到staging服务器,这让你感到担忧? - Mark Longair
不,我担心无论我到哪个分支,每次运行“git pull origin master/development”时都会部署。当我不需要它推送时,我只是不想让它白白浪费。 - schone
1个回答

1
个人而言,我不喜欢这种安排:每次在本地尝试合并到主分支或开发分支时都会导致部署,我更愿意将代码部署作为一项积极的决策 - 没有试图合并某些内容而不进行部署的余地。 (此外,我不确定Heroku的行为,但如果将提交推送到不会更改该引用的引用时,它会重新部署,我会感到惊讶。)最后,通常由拉取完成的合并不会是快进式的,因此必须部署新版本的代码。
但是,如果您真的想这样做,可以在脚本中执行以下操作:
UPSTREAM=$(git rev-parse --symbolic-full-name @{u})

这将给出代表您当前分支上游的远程跟踪分支 - 在后合并挂钩中,您当前的分支就是您刚刚合并的分支。(这个好命令来自于 Kevin Ballard 在 this answer 的评论中。) 您可以使用以下命令找到该提交的对象名称(SHA1sum):

UPSTREAM_OBJECT_NAME=$(git rev-parse --verify $UPSTREAM)

然后您想找出该提交是否是HEAD的父提交之一 - 您可以使用以下命令获取父提交:

HEAD_PARENTS=$(git log -n 1 --pretty=format:"%P")

...所以可以使用以下代码测试上游是否是其中一个父级:

git log -n 1 --pretty=format:"%P" | grep -q $UPSTREAM_OBJECT_NAME

最后,您应该检查reflog的第一行以检查远程跟踪分支是否是通过pull进行的最后更新。换句话说,这行是否为:
git reflog show -n 1 $UPSTREAM

... 包含 pull : fast-forward

这应该为您提供所需的部分,以便编写您想要的post-merge脚本。 但是,再次强调,我真的不希望这样做 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接