gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:18:41 24 4
gpt4 key购买 nike

我有一个名为 master(生产)的分支,另一个名为 development。当我从 master 推送提交时,接收后 Hook 执行:

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

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

最佳答案

你试图用手做的是像 Capistrano 这样的工具。是为了,他们会做得更好(例如,你的版本不是原子的,所以你的网站有一段时间混合了旧/新文件,而 capistrano 会在目录中检查你的树,然后指向一个符号链接(symbolic link)对它来说,这是原子的)。

如果您继续使用“git checkout”,那么“git checkout development”将 check out 开发分支,因此您希望在收到有关开发的引用更新时执行此命令。该脚本将遵循以下行:

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

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

  • 实际上,由于 hook 接收到新的 ref 值,您甚至不需要分支名称,并且可以使用 $new 代替(如果有多个 ref 更新时间彼此接近则更稳健) .

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

  • 可以删除 --git-dir 选项,因为我们正在从当前目录 check out ( Hook 在存储库中执行)。

改进后的脚本是:

#!/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 上的“推送部署”部分

关于git - 如何将推送的分支复制到另一个目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com