1

新しいブランチが作成されたかどうかをチェックする git フックを書いています。ただし、ブランチは実際には作成中のため、私のロジックは失敗します。

現在、私はこれをpost-receiveフックで行っています。これは次のようになります。

#!/bin/sh
read oldrev newrev refname
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
echo "branch is $branch"
echo "oldrev is $oldrev and newrev is $newrev" 

# if $oldrev is 0000...0000, it's a new branch
# also check if the branch is of the format "feature_<name>"
zero="0000000000000000000000000000000000000000"
if [ "$oldrev" = "$zero" ] && [[ $branch =~ feature_.+ ]]; then
    #create a temp repo
    temp_repo=`mktemp -d /tmp/repo.XXXXX`
    cd $temp_repo
    git clone $git_url
    #here i create the config file needed, called file_name
    git checkout "$branch"
    git add "$file_name"
    git commit -m "Added config file"
    git push origin $branch
fi

これは既存のブランチでは機能しますが、新しく作成されたブランチではエラーが発生しますfatal: Not a git repository: '.'

についてあまり知らないので、このロジックをどのフックで使用すればよいかわかりませんgit。これについてどうすればいいですか?

ありがとう

4

1 に答える 1

2

フックにいて、「通常の」git コマンドを実行したい場合は、GIT_DIR環境変数の設定を解除する必要があります (フック内で に設定されてい.ます)。

とはいえ、これは私には正しいアプローチではないようです。動作するはずですが、少し意外に思えます:この新しくコミットされたファイルgit push origin abc:feature_defを取得するために、オリジンから再取得してマージする必要がある場合。$file_nameそのファイルを自分でインクルードすることを要求する方が理にかなっているのではないでしょうfeature_defか?

その場合、pre-receive または update フックがチェックを行う場所になります。簡単な例 (未テスト):

#! /bin/sh
# update hook - check if new branch is named
# feature_*, and if so, require config file

refname=$1
oldrev=$2
newrev=$3

# BEGIN BOILERPLATE
NULL_SHA1=0000000000000000000000000000000000000000

# what kind of ref is it? also, get short name for branch-or-tag
case $refname in
refs/heads/*) reftype=branch; shortname=${refname#refs/heads/};;
refs/tags/*) reftype=tag; shortname=${refname#refs/tags/};;
*) reftype=other;;
esac

# what's happening to the ref?
# note: if update, there are potentially two different objtypes,
# but we only get the new one here
case $oldrev,$newrev in
$NULL_SHA1,*) action=create; objtype=$(git cat-file -t $newrev);;
*,$NULL_SHA1) action=delete; objtype=$(git cat-file -t $oldrev);;
*,*) action=update; objtype=$(git cat-file -t $newrev);;
esac
# END BOILERPLATE

# code to check a feature branch.  Top level file named xyzzy.conf must exist.
check_feature_branch()
{
    if ! git show $refname:xyzzy.conf >/dev/null 2>&1; then
        echo "new branch $branch does not contain xyzzy.conf at top level" >&2
        exit 1
    fi
}

# check whether we're creating a branch named feature_*

case $action,$reftype,$shortname in
create,branch,feature_*) check_feature_branch;;
*) ;;
esac

# if we got here it must be OK
exit 0
于 2013-08-20T00:38:03.357 に答える