【问题标题】:How to copy a pushed branch to another directory?如何将推送的分支复制到另一个目录?
【发布时间】:2015-07-03 02:13:51
【问题描述】:

我有一个名为 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 。

【问题讨论】:

  • 你的post-receive钩子目前是什么样子的?它应该从标准输入中读取描述推送到远程的每个分支(实际上是参考)的行,并使用每一行来构造一个适当的git checkout 调用。
  • 也许是git archive?

标签: git ubuntu githooks


【解决方案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

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

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

  • 可以删除 --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 中引入的 receive.denyCurrentBranch 的新 updateInstead 值。例如,参见https://github.com/blog/1957-git-2-3-has-been-released上的“推送部署”部分

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2015-01-01
    • 2021-10-11
    • 2013-08-15
    • 1970-01-01
    • 2015-03-01
    • 2019-12-10
    • 2014-10-09
    相关资源
    最近更新 更多