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

2024-05-08

我有一个分支叫master(生产)另一个称为development。当我从 master 推送提交时,post-receive 挂钩执行:

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

该网站已上线。但我想要我的development分支复制到 /var/www/mywebsite.com.dev 。


你想要手工做的事情就是像这样的工具卡皮斯特拉诺 http://capistranorb.com/是为了,他们会做得更好(例如,你的版本不是原子的,所以你的网站有一段时间混合了旧/新文件,而 capistrano 会在目录中检查你的树,然后指向一个符号链接到它,这是原子的)。

如果您继续使用“git checkout”,那么“git checkoutdevelopment”将签出开发分支,因此您希望在收到有关开发的参考更新时执行此命令。该脚本的内容如下:

#!/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

关于相关主题,您还可以查看新的updateInstead价值receive.denyCurrentBranchGit 2.3 中引入。例如,请参阅“推送部署”部分https://github.com/blog/1957-git-2-3-has-been-released https://github.com/blog/1957-git-2-3-has-been-released

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐