1

我正在使用 git 发布一个网站。工作流程大致是:

$ git add my_file
$ git commit -m comment my_file
$ git push # Just house-keeping, goes to my master repo
$ git push ssh://user@webserver//var/www/repo.git

Web 服务器上的 post-receive 挂钩如下所示:

#!/bin/bash

working=$(pwd)
working=${working##*/}
working=../${working%.*}
while read oldrev newrev ref ; do
    branch=$(echo ${ref} | cut -d/ -f3)
    GIT_WORK_TREE=${working} git checkout -f ${branch}
done

绝大多数情况下,这工作得很好。当我说好时,我的意思是,如果我添加了一个文件,结帐会修改那个文件。

只有当我等待一天然后再次提交并推送时,post-receive 挂钩中的 git checkout 才会重新获取我工作副本中的每个文件。它不仅需要很长时间,而且会与我稍后运行的 rsync 混淆。

一夜之间会发生什么,以至于明天发生的结帐与我今天可以一遍又一遍地重复的结帐完全不同?

4

1 回答 1

0

你在使用分支吗?从您的 post-receive 钩子看来,您没有过滤要使用哪个 ref 来托管您的网站代码。相反,它对每个修改过的 ref 进行检查。如果您将一些代码推送到另一个分支,那么您的站点将被更新以反映这一点。我认为您可能只想为重要的 ref 运行结帐(也许refs/heads/master),仅此而已。

也许改变

while read oldrev newrev ref ; do
    branch=$(echo ${ref} | cut -d/ -f3)
    GIT_WORK_TREE=${working} git checkout -f ${branch}
done

while read oldrev newrev ref ; do
    if [ "$ref" == "refs/heads/master" ]; then
        branch=$(echo ${ref} | cut -d/ -f3)
        GIT_WORK_TREE=${working} git checkout -f ${branch}
    fi
done
于 2013-10-29T10:52:00.277 回答