2013-10-29 41 views
1

我使用git发布网站。 工作流程大致是:在Web服务器上git checkout修改太多文件

$ git add my_file 
$ git commit -m comment my_file 
$ git push # Just house-keeping, goes to my master repo 
$ git push ssh://[email protected]//var/www/repo.git 

一个后收到钩看起来是这样的:

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

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

只有当我等待一天然后再次提交&推送时,post-receive钩子中的git checkout才会重新获取我工作副本中的每个文件。它不仅需要很长时间,还会随后使用rsync运行。

一夜之间会发生什么事情,以便明天发生的结帐与我今天可以一遍又一遍地重复的结帐大不相同?

回答

0

你是否在使用分支机构?从你的post-receive钩子看来,你没有过滤你想用来托管你的网站代码的参考。相反,它会为每个修改过的参考文件进行结帐。如果您将一些代码推送到另一个分支,那么您的网站将会更新以反映这一点。我想你可能只想运行重要的裁判(可能是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 
+0

我不是在所有使用分支。所以我总是看到git提到我已经在掌握了。但是,为了消除模糊性,我将简化post-receive钩子。最大的问题是,它大部分时间都在运行,但如果我从最后一次推送后的一天内推出,则会失败。 – craigemery

+0

另外:不用'cut -d/-f3',通常最好用'$ {ref#refs/heads /}'去掉'refs/heads /'',以免这样处理一个分支名称,例如'refs/heads/foo/bar'就好像它只是'foo'而不是'foo/bar'。在这种情况下不是问题,但是,在这种情况下,您可以执行'branch = master'。 :-) – torek

+0

是的。如果不是很明显,我只是向他展示了如何设定该区块的条件。我更喜欢使用你自己指出的符号。但是你是绝对正确的,在这种情况下,它可以被清理为'branch = master',或者将分支名称放在checkout命令中。 – jszakmeister