假设我有一台服务器,它有一个现有的生产站点及其暂存站点。
现在我在~/
创建了一个具有hook/post-receive
#!/bin/bash
# post-receive
# deploy production and staging to vhost dirs
# Directory we are deploying to. Should be the directory where the repo's root .gitignore would exist in.
PRODDEST="/path/to/destination/of/production"
STAGDEST="/path/to/destination/of/staging"
while read oldrev newrev refname; do
# Grab the name of the branch that was pushed.
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" = "$branch" ]; then
echo "Master push, deploy production..."
GIT_WORK_TREE=$PRODDEST git checkout -f master
GIT_WORK_TREE=$PRODDEST git clean -fd
elif [ "develop" = "$branch" ]; then
echo "Develop push, deploy staging..."
GIT_WORK_TREE=$STAGDEST git checkout -f develop
GIT_WORK_TREE=$STAGDEST git clean -fd
fi
done
通过从本地推送到任一远程分支,相应文件夹中的代码在服务器上得到更新。这有效,但我太谨慎了,因为我只是在虚拟制作和暂存文件夹上这样做了。
现在,如果我想在现有的生产网站上使用它,而不移动其位置,该怎么办? (更改PRODDEST
和STAGDEST
位置后)
我进入我的生产根文件夹,其中包含所有现有代码并运行git init
,git add .
,git commit -m "initial commit"
,git add remote hub ~/hub.git
和git push hub master
。 (还要添加一个bitbucket来源并推送到那个。)
我将为.git
.htaccess
文件夹添加重写
测试时,我收到消息,要求我先从集线器拉出而不是推送到集线器,因为集线器中有代码,但不在生产文件夹中。
这是一种理智的方式吗,而不会弄乱现有的网站?还有什么我应该注意的吗?
答案 0 :(得分:0)
这看起来很正确(见下文),这一点:
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
是一个很好的避免取决于ref格式的技巧,但我可能会欺骗并编写循环内部更像:
while read oldrev newrev refname; do
case $refname in
refs/heads/master) deployto $PRODDEST prod master;;
refs/heads/develop) deployto $STAGDEST dev develop;;
esac
done
使用deployto()函数执行结帐(如果您愿意,也可以使用git clean
,但似乎不需要此步骤)。请参阅下面的中间论点。
这里有“很大程度上正确”的地方,可能就是你需要git clean
的原因。 Git在index
文件中保留目标目录($PRODDEST
或$STAGDEST
)外观的缓存。它不希望目标从一个git checkout
更改为下一个deployto() {
GIT_WORK_TREE=$1 GIT_INDEX_FILE=$PWD/$GIT_DIR/$2.index git checkout $3
}
。它使用先前的缓存状态来优化将工作树更新到新状态的过程。如果登台和制作完全不同,当最后一次结账到另一棵树时,git将无法获得“之前的状态”。
我认为设置每个目标索引文件是处理此问题的“正确方法”。有很多方法可以构建它,但这是一个使用中间参数的轻度测试方法:
-f
(此处也不需要for(i=d;i>0;i--)
{
a=a+(num[i-1]*f);
f=f*10;
}
,除非由于某种原因,Web服务器修改了目标目录。)