Возможно ли сделать git commit на сервере обновления на стороне сервера

Суть моей задачи: собрать информацию о репо и поместить ее в файл во время обновления хука и зафиксировать его (идеально с новой фиксацией).

Проблемы: когда я делаю коммит -> он блокирует репозиторий origin и после этого push не работает. мой код выглядит так:

#!/bin/bash

# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
export GIT_WORK_TREE=$PWD

# --- 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

version="${refname##*_}"
branchName="${refname##*/}"
filePath="_componentVersion/BranchVersion.ps1"

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

case "$refname","$newrev_type" in
        refs/heads/*,commit)
                if [ "$oldrev " != "$zero" ]; then
                        version="${refname##*_}"
                        branchName="${refname##*/}"
                        filePath="_componentVersion/BranchVersion.ps1"

                        countOfCommits=$(git rev-list --count START_$version..$newrev)
                        countOfPushes=$(git log --pretty=oneline START_$version..$newrev | grep 'Issue nr: HOOK_$version' | wc -l)
                        countOfPushes=$(($countOfPushes+1))
                        echo git log --pretty=oneline START_$version..$newrev

                        message="
# -----------------------
# Brancht Version Info
# -----------------------

\$branch = '$version'
\$countOfCommits = $countOfCommits
\$countOfPushes = $countOfPushes # push
\$commitHash = '$newrev'
                        "

                        # credits go to https://stackoverflow.com/questions/9670302/commit-directly-to-a-bare-repository
                        # branch commit - here we will do the magic about count of commits and about count of pushes
                        # here we create file for info

                        # Empty the index, not sure if this step is necessary
                        git read-tree --empty

                        # Load the current tree. A commit ref is fine, it'll figure it out.
                        git read-tree "${newrev}"

                        # create blob from stdin
                        BLOB_ID=$(echo "$message" | git hash-object -w --stdin)

                        # update indexes in git
                        git update-index --add --cacheinfo 100644 "$BLOB_ID" "$filePath"

                        # Create a tree from your new index
                        TREE_ID=$(git write-tree)

                        # Commit it.
                        NEW_COMMIT=$(echo "Issue nr: HOOK_$version $message" | git commit-tree "$TREE_ID" -p "$oldrev")

                        # Update the branch
                        git update-ref "$refname" "$NEW_COMMIT" "$oldrev"
                fi

                # Done
                exit 0
                ;;
        *)
                # Other actions except commit to branch / for now - we won't check it
                exit 0
                ;;
esac

# --- Finished
exit 0

Я работаю с голым репо. И пример коммита взят из здесь Execte проблема

remote: error: cannot lock ref 'refs/heads/REL_7.0.0': ref refs/heads/REL_7.0.0 is at 54f2454ddab36eda001e27946733a7b0e981f097 but expected 89a3032e0bfb999273205e32b7f6d57173c4bd7e 

person xAqweRx    schedule 07.08.2018    source источник


Ответы (1)


Вы можете создавать коммиты.

Вы не можете обновлять заблокированные ссылки, в том числе ту, для которой вызывается обработчик обновления.

Поскольку git push может передавать несколько имен ссылок, могут быть дополнительные заблокированные ссылки. В общем, не рекомендуется обновлять что-либо, что кто-либо может git push выполнять внутри хука, вызванного git push. Другими словами, не пытайтесь обновить имя какой-либо ветки или тега. Если вы хотите создать новые объекты, прикрепите их к какому-либо имени вне этих двух пространств имен.

(Кроме того, git read-tree --empty не является обязательным, но в любом случае рекомендуется использовать временный индексный файл, а не основной индекс.)

person torek    schedule 07.08.2018
comment
Итак, если я правильно понял - лучший вариант - создать для этого другую ветку и зафиксировать изменения там. Проблема в том, что мне нужно, чтобы эта информация сохранялась при обновлении ссылки. Можете ли вы посоветовать возможный обходной путь? - person xAqweRx; 08.08.2018
comment
В конечном счете, вы не можете изменить текущее обновление: вы можете только принять его или отклонить. Вы можете поместить коммит в другое место, возможно, даже в другой репозиторий Git. Наверное, это был бы самый безопасный подход. - person torek; 08.08.2018
comment
Спасибо. Вероятно, это будет реализовано в виде комбинации перехватчиков обновления и пост-получения. где update - сохранит где-то информацию о том, какие ссылки были обновлены, а post-receive обработает их и обновит информацию только о тех ссылках, которые были обновлены. - person xAqweRx; 08.08.2018
comment
Вы можете заставить это работать, но обратите внимание, что ваш хук post-receive будет получать всю ту же информацию, что и ваш хук обновления (после завершения всех обновлений). Другое основное отличие состоит в том, что вы получаете их все сразу при стандартном вводе, а не вызываете один раз при каждом обновлении. Добавление большего количества коммитов к ссылкам на ветки на этом этапе допустимо, но учтите, что теперь вы будете соревноваться с другими перехватчиками post-receive из других git push команд. - person torek; 08.08.2018