如何将推送的分支复制到另一个目录?

3

我有一个名为master(生产环境)和另一个名为development的分支。当我从master分支推送一个提交时,post-receive hook会执行:

git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f

网站已上线,但我想将我的开发分支复制到 /var/www/mywebsite.com.dev。


你的 post-receive 钩子现在是什么样子?它应该从标准输入中读取描述推送到远程的每个分支(实际上是 ref)的行,并使用每行构造适当的 git checkout 调用。 - chepner
也许可以使用 git archive - twalberg
1个回答

1
您手动尝试的内容是Capistrano等工具的目的,它们会更好地完成此任务(例如,您的版本不是原子性的,因此您的网站在一段时间内会有旧/新文件混合,而capistrano将在目录中检出树,然后指向一个符号链接,这是原子性的)。
如果您选择使用“git checkout”,那么“git checkout development”将会检出开发分支,因此当您收到开发更新时,您需要执行此命令。脚本应该按以下方式进行:
#!/bin/sh

while read old new refname
do
    case "$refname" in
        refs/heads/master)
            git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
            ;;
        refs/heads/development)
            git --work-tree=/var/www/mywebsite.com.dev --git-dir=/var/repo/mywebsite.com.git checkout -f refs/heads/development
            ;;
    esac
done

现在,我们可以通过以下几种方式改进脚本:

  • 实际上,由于挂钩接收新的引用值,您甚至不需要分支名称,可以使用 $new 代替(如果有多个引用更新接近时间,则更加健壮)。

  • 为了提高效率,我们可以每个检出维护一个索引文件(这样未修改的文件就不需要实际检出)。

  • --git-dir 选项可以删除,因为我们是从当前目录检出的(挂钩在存储库内执行)。

改进后的脚本如下:

#!/bin/sh

while read old new refname
do
    case "$refname" in
        refs/heads/master)
            GIT_INDEX_FILE="$PWD"/index.master git --work-tree=/tmp/www/mywebsite.com checkout -f $new
            ;;
        refs/heads/development)
            GIT_INDEX_FILE="$PWD"/index.development git --work-tree=/tmp/www/mywebsite.com.dev checkout -f $new
            ;;
    esac
done

关于这个话题,你也可以看一下 Git 2.3 中引入的 updateInstead 值和 receive.denyCurrentBranch。例如,在https://github.com/blog/1957-git-2-3-has-been-released上查看“Push to deploy”部分。


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