Как обработать новую ветку в git-скрипте pre-receive? - PullRequest
0 голосов
/ 28 мая 2018

У меня есть сценарий для блокировки неразрешенных конфликтов слияния, которые нужно выдвинуть:

#!/bin/bash

echo "pre-receive HOOK: $old_sha $new_sha"

while read old_sha new_sha refname
do

if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
    echo "Saw a conflict marker in $(basename "$refname")."
    git diff "$old_sha" "$new_sha" | grep -nE '^\+(<<<<<<<|>>>>>>>)'
    exit 1
fi

done

exit 0

Но когда нажата новая ветка, я получаю следующее сообщение об ошибке:

fatal: bad object 000000000000000000000000000000000000000000

Полный вывод:

Counting objects: 77, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (58/58), done.
Writing objects: 100% (77/77), 11.27 KiB | 5.63 MiB/s, done.
Total 77 (delta 52), reused 14 (delta 6)
remote: pre-receive HOOK
remote: fatal: bad object 0000000000000000000000000000000000000000
To https://tracker.feel-safe.net/gitdev/main.git
 * [new branch]        296-ToS-component -> xxx

И, как вы видите, зафиксированные изменения зафиксированы.

Как обрабатывать новые ветви в pre-receive hook?

Должен ли я вместо этого создать update hook?

1 Ответ

0 голосов
/ 28 мая 2018

При создании новой ссылки old_sha равно 0000000000000000000000000000000000000000.У этого хеша нет реального объекта, поэтому git diff не может работать должным образом.Если вам нужен diff, используйте git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 $new_sha.4b825dc642cb6eb9a060e54bf8d69288fbee4904 - это хеш пустого дерева, которое может работать без реального объекта.

Вам нужно иметь дело с другим подобным случаем, в котором ссылка удаляется, а new_sha равно 0000000000000000000000000000000000000000.Аналогично, используйте git diff $old_sha 4b825dc642cb6eb9a060e54bf8d69288fbee4904, чтобы получить разность.

Вы можете увидеть pre-push.sample под .git/hooks для справки.Это хороший пример, который показывает, как работать с созданием, удалением и обновлением ссылки, за исключением того, что pre-receive не принимает аргументов, а pre-push принимает два.Но оба могут читать что-то из стандартного ввода.

...