Проблемы с отправкой данных коммитов на ловушку post-receive через curl (git) - PullRequest
0 голосов
/ 14 февраля 2012

Цель моего проекта - записать каждый коммит, сделанный разработчиком, в mongodb.Я настроил прослушиватель
nodejs, который будет сохранять данные, полученные в сообщении, на mongo.

Я запускаю сервер 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, которые я использую.

Один (ленивый) вариант - использовать git log без какой-либо информации о ревизиях и избегать добавления дублирующих коммитов в мою коллекцию с помощью проекта.имя / мерзавец совершить идентификатор.Но это будет медленно на больших репозиториях.

1 Ответ

1 голос
/ 14 февраля 2012

Не уверен, поможет ли это здесь, но в хуке pre-commit.sample они используют этот трюк:

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

Этот последний хеш является хешем для пустого хранилища и жестко закодирован в git.

...