1

我们正在用我们的网站测试 git 版本控制。当前设置在网络共享驱动器 /g/ 上有两个裸存储库(一个用于 Intranet,一个用于 Internet)。当推送到这个存储库时,我希望网站自动签出到 /x/ 的网络服务器。根据这里几个博客和问题的建议,我设置了一个post-receive hook,如下:

#!/bin/sh
GIT_WORK_TREE=/x/intranet checkout -f

这对于部署每个存储库的主分支非常有效。每次部署可能需要 5-10 秒。但是,我们还希望有一个自动签出到 /y/ 的开发服务器的 dev 分支。我修改后的钩子看起来像这样:

#!/bin/sh
GIT_WORK_TREE=/x/intranet checkout -f master
GIT_WORK_TREE=/y/intranet checkout -f dev

这是非常有问题的,因为现在推送大约需要 15 分钟。问题似乎是每个分支的整个工作目录都被重写了,而不是仅仅更新任何已更改的文件。即使添加了一个条件来检查哪个分支被推送并且只签出那个分支,如果我推送了之前推送的分支以外的分支,推送仍然需要大约 10 分钟。显然这是不可接受的。

我目前的尝试在每台服务器上都有 2 个存储库(一个 Intranet 和一个 Internet)。我现在运行的钩子如下所示:

#!/bin/bash

while read oldrev newrev ref
do
  branch=`echo $ref | cut -d/ -f3`

  if [ "master" == "$branch" ]; then
    cd /x/intranet
    unset GIT_DIR
    git pull --verbose origin master
    echo "Changes pushed to production server."
  fi

  if [ "dev" == "$branch" ]; then
    cd /y/intranet
    unset GIT_DIR
    git pull --verbose origin dev
    echo "Changes pushed to dev server."
  fi

done

这个钩子仍然比我认为它应该运行的时间更长(几乎 2 分钟,而我自己运行一个 repos 大约需要 4 秒)。我的任何一个实现都有问题吗?还是有另一种方法可以解决这个问题?

编辑:我想知道在 git bash shell 中使用已安装的驱动器是否可能是问题所在?

4

0 回答 0