Gitolite和存储在一台服务器上的Web服务器。目录/var/www/site
是repo" site"的克隆。 Git用户包含组www-data。我在/home/git/repositories/site.git/hooks/post-update hook
:
#!/bin/sh
unset GIT_DIR
cd /var/www/site && git pull origin master
一切都很完美,但在"拉"所有更新或新文件将所有者更改为git:git。我不知道如何更改所有者没有root用户的权限。有什么建议吗?
我找到了好的方法(更新后):
#!/bin/sh
PATH=/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
PROJECT="projectname"
GIT_URL="http://factory.domain.ru/git"
git update-server-info
if [ ! -f $1 ]; then
exit 0
fi
while [ -n "$1" ]
do
REF=`echo $1 | awk --field-separator="/" '{print $2}'`
if [ $REF = "branches" -o $REF = "heads" ]; then
BRANCH=`echo $1 | awk --field-separator="/" '{print $3}'`
if [ ! -d /srv/www/$PROJECT/repo/master ]; then
mkdir -p /srv/www/$PROJECT/repo
GIT_SSL_NO_VERIFY=true git clone $GIT_URL/$PROJECT /srv/www/$PROJECT/repo/master
fi
if [ ! -d /srv/www/$PROJECT/repo/$BRANCH ]; then
GIT_SSL_NO_VERIFY=true git clone -b $BRANCH $GIT_URL/$PROJECT /srv/www/$PROJECT/repo/$BRANCH
else
cd /srv/www/$PROJECT/repo/$BRANCH
GIT_SSL_NO_VERIFY=true git fetch origin
GIT_SSL_NO_VERIFY=true git reset --hard origin/$BRANCH
GIT_SSL_NO_VERIFY=true git clean -d -f
GIT_SSL_NO_VERIFY=true git checkout
GIT_SSL_NO_VERIFY=true git pull
fi
fi
shift
done
"更新":
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"
PROJECT="projectname"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "Usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero="0000000000000000000000000000000000000000"
if [ "$newrev" = "$zero" ]; then
newrev_type=delete
else
newrev_type=$(git cat-file -t $newrev)
fi
BRANCH=`echo $1 | awk --field-separator="/" '{print $3}'`
delete () {
mv /srv/www/$PROJECT/repo/$BRANCH /srv/www/$PROJECT/repo/$BRANCH.removed_by_git
rm -rf /srv/www/$PROJECT/repo/$BRANCH.removed_by_git
}
case "$refname","$newrev_type" in
refs/heads/*,delete)
# delete branch
delete
;;
refs/remotes/*,delete)
# delete tracking branch
delete
;;
esac
exit 0
答案 0 :(得分:1)
您不能在不授予用户root权限的情况下 - 但是,您可以通过sudo
执行此操作,这样他就无法执行任何操作,只需更改该文件夹的所有者即可。
以这种方式配置sudo之后,您只需将sudo chown -R www-data:www-data /var/www/site
添加到钩子中即可。
答案 1 :(得分:1)
正如@ThiefMaster所说,你不能像这样改变文件所有权,但是有一种不同的方法可以解决这个问题。
当您从某个开发系统(可能是与部署系统相同的系统,可能还有其他系统)推送并使用gitolite进行访问时,您将推送到ssh://git@server/repo
(或某些URL变体,但在任何使用ssh到gitolite服务器机器,以用户git
登录该服务器机器 - 我们设置为以gitolite
登录,但根据您的问题,您正在使用用户{{ 1}})。但是,除了身份验证的工作方式之外,从服务器的角度来看,“developer @ dev-host推送给我,用户git”实际上与“我,用户git,从开发人员@ dev-host拉”相同。这就是为什么,在你的post-receive钩子中,当你运行git
之类的命令时,新文件归用户cd /var/www/site && git pull origin master
所有:它的用户git正在合并到“他的”本地仓库,然后做另一个回购的git
和cd
步骤。
git pull
首先可以进入developer@dev-host
的原因是服务器的git@server
文件包含~git/.ssh/authorized_keys
的公钥(通过gitolite的管理仓库和添加用户密钥时适用的各种魔法)。因此,假设用户developer@dev-host
拥有自己的ssh密钥对,并且假设您希望git@server
由用户/var/www/site
拥有。然后,如果用户www-site
有一个主目录(可能是www-site
)并且该主目录有一个/var/lib/www-site
文件授权用户.ssh/authorized_keys
的密钥,那么用户git
可以用户git
ssh。您的更新后挂钩将执行以下操作:
www-site
(我添加了代码来识别两个特定的分支并仅为这些分支执行更新。注意:这些都没有经过测试。)
答案 2 :(得分:0)
# su requireduser -c 'git pull origin branch'