2012-10-16 34 views
2

Gitolite和存儲在一臺服務器上的Web服務器。目錄/var/www/site是回購「網站」的克隆。一個Git用戶包含在組www數據中。我在/home/git/repositories/site.git/hooks/post-update hook如何在執行post-update hook後更改所有者?

#!/bin/sh  
unset GIT_DIR 
cd /var/www/site && git pull origin master 

所有工作完美,但經過「拉」的所有更新或新的文件所有者更改爲的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 

habrahabr.ru

回答

1

正如@ThiefMaster所說的,你不能像這樣改變文件所有權,但是解決這個問題的方法有很多。

當您從某個開發系統(可能與部署系統相同的系統,可能還有其他系統)推送並且正在使用gitolite進行訪問時,您會推送到ssh://[email protected]/repo(或某種URL變體,但無論如何, ssh登錄到gitolite服務器上,以用戶git的身份登錄該服務器計算機 - 設置爲登錄爲gitolite,但根據您使用用戶git的問題登錄)。儘管從服務器的角度來看,除了身份驗證的方式外,「developer @ dev-host推給我,用戶git」與「我,用戶git,從開發人員@ dev-host中拉出」實際上是一樣的。這就是爲什麼在你的post-receive hook中,當你運行如cd /var/www/site && git pull origin master這樣的命令時,新文件歸用戶git所有:它是用戶git合併到他的本地回購,然後在另一個回購中執行cdgit pull步驟。

原因[email protected]可以ssh到[email protected]擺在首位的是服務器的~git/.ssh/authorized_keys文件包含[email protected]公鑰(通過gitolite的管理員回購和各種魔法它適用於當您添加用戶密鑰)。因此,假設用戶[email protected]有他自己的ssh密鑰對,假設您要/var/www/site由用戶www-site擁有。然後如果用戶www-site有一個主目錄(可能是/var/lib/www-site),並且該主目錄有一個.ssh/authorized_keys文件授權用戶git的密鑰,則用戶git可以以用戶www-site的身份登錄。然後,您的post-update掛鉤會做這樣的事情:

#! /bin/sh 

# update running copy on real host 
update_master() { 
    ssh [email protected] "cd /var/www/site && git pull origin master" 
} 

# update test copy on test host 
update_test() { 
    ssh [email protected] "cd /var/www/site && git pull origin test" 
} 

for ref do 
    case "$ref" in 
    refs/heads/master) update_master;; 
    refs/heads/test) update_test;; 
    *) ;; # ignore other branches 
done 

(我添加的代碼來識別兩個特定的分支,只有那些做更新注意:這些都不是測試)

+0

有趣的選擇。 +1 – VonC

1

你不能沒有授予用戶root訪問權限 - 但是,你可以通過sudo這樣做,所以他不能做任何事情,只能改變該文件夾的所有者。

以這種方式配置sudo後,您可以簡單地將sudo chown -R www-data:www-data /var/www/site添加到鉤子。

+0

@TheifMaster,舊的答案,但想問:是不是很好的做法,使用掛鉤來更改git用戶創建的新文件的所有權?另外,哪個鉤子,「更新後」?我遇到了類似的問題,我不確定如何處理'git pull'後的文件所有權更改。 – musicliftsme

0

# su requireduser -c 'git pull origin branch'