Git post-receive hook将每个分支签出到不同的文件夹?

Ben*_*ain 7 git git-post-receive

我们的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
Run Code Online (Sandbox Code Playgroud)

收到的错误是:

'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
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释我在这里做错了什么(随意解释它就像你对一个3岁的孩子:)).谢谢.

为了让未来读者能够更清楚地了解答案,Torek将其击中.我正在--work-tree=/master尝试进入一个名为'master'的文件夹,在我的裸仓库的根目录内(例如,与'branches','hooks'等).一旦我将其更改为--work-tree=./master(注意正斜杠之前的点),一切都按预期工作.

小智 7

你应该把'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
Run Code Online (Sandbox Code Playgroud)

它工作得很好,谢谢你的帖子!:)


tor*_*rek 3

你得到这个是因为/master/develop是不存在的目录:

$ git --work-tree=/nonexistent checkout master
fatal: This operation must be run in a work tree
Run Code Online (Sandbox Code Playgroud)

您可能还想查看我对有关此方法出现的另一个问题的回答,该方法还解决了您从流行但错误的接收后技术复制的一个小错误(使用 来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)
}
Run Code Online (Sandbox Code Playgroud)

(未经测试,请随意实验和/或修改)。这在磁盘空间和更新窗口方面还有其他略有不同的权衡(我在其他答案中提到)。