0

私のプロジェクトの目的は、開発者が行ったすべてのコミットを mongodb に記録することです。
mongo への投稿で受信したデータを保持する nodejs リスナーをセットアップしました。

私は gitolite サーバーを実行しており、開発者がプッシュするたびに post-receive フックを使用して、curl 経由でノード リスナーにコミットを投稿しています。

0000000000000000000000000000000000000000古いリビジョンがgit log を実行しようとすると無効な引数を取得する最初のコミットを除いて、私はこれをうまくやっています。

あいまいな引数 '8a2db961045bd4825624b16ad62e75be49dd70b6~1..8a2db961045bd4825624b16ad62e75be49dd70b6': 不明なリビジョンまたはパスが作業ツリーにありません。「--」を使用してパスをリビジョンから分離します

私の bash/post-receive スクリプトからの抜粋を以下に示します。

#!/bin/sh
# Read git data on STDIN
while read oval nval ref ; do
    if expr "$ref" : "^refs/heads/"; then
        if expr "$oval" : '0*$' >/dev/null
        then
            revspec=$nval
        else
            revspec=$oval..$nval
        fi
        other_branches=$(git for-each-ref --format='%(refname)' refs/heads/ |
            grep -F -v $ref)

        # Get the name of the repository
        if [ $(git rev-parse --is-bare-repository) = true ]
        then
                 REPOSITORY_BASENAME=$(basename "$PWD")
        else
                REPOSITORY_BASENAME=$(basename $(readlink -nf "$PWD"/..))
        fi
        REPOSITORY_BASENAME=${REPOSITORY_BASENAME%.git}

        for revision in `git rev-parse --not $other_branches | 
            git rev-list --stdin $revspec`; do
                COMMIT_ID=$(git log $revision~1..$revision --pretty=format:'%H')
                DATE=$(git log $revision~1..$revision --date=short --pretty=format:'%ad')
                MSG=$(git log $revision~1..$revision --pretty=format:'%s')
                AUTHOR=$(git log $revision~1..$revision --pretty=format:'%ae')
                curl -s
                    -d "commit_id=$COMMIT_ID&date=$DATE&msg=$MSG&author=$AUTHOR&project=$REPOSITORY_BASENAME"
                    $LISTENER_RECEIVE
        done
    fi
done

bashスクリプト/使用しているgitコマンドでこれを処理する方法が正確にはわかりません。

1 つの (怠惰な) オプションは、リビジョン情報なしで git log を使用し、プロジェクト名/git コミット ID を使用してコレクションに重複したコミットを追加しないようにすることです。しかし、それは大規模なリポジトリでは遅くなります。

4

1 に答える 1