[英]Git post-receive hook fails to checkout, fatal: You are on a branch yet to be born
[英]Git post-receive hook to checkout each branch to different folders?
我们的Git工作流的基本设置是本地网络服务器上的裸存储库,有两个开发人员推送/拉动它。
我们希望自动复制(签出)被推送到本地网络服务器上不同位置的每个分支。 举例说明:
将'develop'分支复制到'develop'子文件夹。 将“主”分支复制到“主”子文件夹。
我们遇到的问题是获得post-receive hook来做到这一点。 这是我们目前拥有的:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then
GIT_WORK_TREE=/master
git checkout -f $branch
echo 'Changes pushed master.'
fi
if [ "develop" == "$branch" ]; then
GIT_WORK_TREE=/develop
git checkout -f $branch
echo 'Changes pushed to develop.'
fi
done
收到的错误是:
'remote:fatal:这个操作必须在远程工作树中运行:推动变革发展。
正如您对该错误所期望的那样 - 实际上没有任何内容被检出。
我也尝试过这种方式接收,但同样的问题:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then
git --work-tree=/master checkout -f $branch
echo 'Changes pushed master.'
fi
if [ "develop" == "$branch" ]; then
git --work-tree=/develop checkout -f $branch
echo 'Changes pushed to develop.'
fi
done
任何人都可以解释我在这里做错了什么(随意解释它就像你对一个3岁的孩子:))。 谢谢。
为了让未来读者能够更清楚地了解答案 ,Torek将其击中。 我正在使用--work-tree=/master
尝试进入我的裸--work-tree=/master
根部内的一个名为'master'的文件夹(例如旁边的'branches','hooks'等)。 一旦我将其更改为--work-tree=./master
(注意正斜杠之前的点),一切都按预期工作。
你应该把'GIT_WORK_TREE = / master git checkout -f $ branch'放在一行,然后它就可以了,看了你的帖子后,我的收到的是:
#!/bin/sh while read oldrev newrev ref do branch=`echo $ref | cut -d/ -f3` if [ "master" == "$branch" ]; then GIT_WORK_TREE=/home/tnj/www/www.test.com git checkout -f $branch chmod -R 775 /home/tnj/www/www.test.com/ echo 'changes pushed to www.test.com' fi if [ "develop" == "$branch" ]; then GIT_WORK_TREE=/home/tnj/www/www.test.com.dev git checkout -f $branch chmod -R 775 /home/tnj/www/www.test.com.dev/ echo 'changes pushed to www.test.com.dev' fi done
它工作得很好,谢谢你的帖子! :)
你得到这个是因为/master
和/develop
是不存在的目录:
$ git --work-tree=/nonexistent checkout master
fatal: This operation must be run in a work tree
您可能还希望看到我对这个方法出现的另一个问题的问题的答案 ,这也解决了您从一个流行但错误的接收后技术中复制的一个小错误(使用cut
来解析更新参考)。
[你的措辞也让我想知道你是否在考虑将这两个分支部署到接收推送的(可能是--bare
)存储库中的子目录中。 这可能不是一个好主意。]
另一种(不同的)部署方法是在部署位置拥有“真正的”git树。 然后,而不是git --work-tree=... checkout
你会做这样的事情:
deploy()
{
local path=$1 branch=$2
(cd $path && unset GIT_DIR && git fetch && git checkout -f origin/$branch)
}
(未经测试,随意进行实验和/或修改)。 这在磁盘空间和更新窗口方面有其他略有不同的权衡(我在另一个答案中提到)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.