2

Gitolite と Web サーバーが 1 つのサーバーに格納されています。ディレクトリ/var/www/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

habrahabr.ru

4

3 に答える 3

1

@ThiefMasterが言ったように、そのようにファイルの所有権を変更することはできませんが、問題を回避する別の方法があります。

ある開発システム(おそらくデプロイメントシステムと同じシステム、場合によっては他のシステム)からプッシュし、アクセスにgitoliteを使用しているssh://git@server/repo場合、(またはいくつかのURLバリアントですが、いずれの場合もsshを使用してgitoliteサーバーにプッシュします) machine、そのサーバーマシンにユーザーとしてログインします—ユーザーgitとしてログインするように設定されてgitoliteいますが、使用している質問に基づいていますgit)。ただし、認証の動作方法を除いて、サーバーの観点からは、「developer @ dev-host push to me、user git」は、実質的に「me、user git、pulling fromdeveloper@dev-host」と同じです。そのため、受信後のフックで、のようなコマンドを実行するcd /var/www/site && git pull origin masterと、新しいファイルはユーザーによって所有されますgit。ユーザーgitが「彼の」ローカルリポジトリにマージを実行します。cdそしてgit pull別のリポジトリを踏みます。

developer@dev-hostそもそもSSHで接続できる理由git@serverは、サーバーの~git/.ssh/authorized_keysファイルにdeveloper@dev-host(gitoliteの管理リポジトリとユーザーキーを追加するときに適用されるさまざまな魔法を介して)の公開鍵が含まれているためです。したがって、ユーザーが独自のsshキーペアを持っていて、ユーザーが所有しgit@serverたいとします。次に、ユーザーにホームディレクトリ(おそらく)があり、そのホームディレクトリにユーザーのキーを承認するファイルがある場合、ユーザーはユーザーとしてSSHで接続できます。更新後のフックは、次のようになります。/var/www/sitewww-sitewww-site/var/lib/www-site.ssh/authorized_keysgitgitwww-site

#! /bin/sh

# update running copy on real host
update_master() {
    ssh www-site@server "cd /var/www/site && git pull origin master"
}

# update test copy on test host
update_test() {
    ssh www-site@testhost "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

(2つの特定のブランチを認識し、それらに対してのみ更新を行うコードを追加しました。注:これはテストされていません。)

于 2012-10-17T12:29:40.073 に答える
1

ユーザーにルートアクセスを許可しないsudoとできませんが、それを介して許可できるため、そのフォルダーの所有者を変更する以外は何もできません。

そのように sudo を設定したらsudo chown -R www-data:www-data /var/www/site、フックに追加するだけです。

于 2012-10-16T16:14:55.643 に答える
0

# su requireduser -c 'git pull origin branch'

于 2017-04-06T11:29:27.040 に答える