Можно ли избежать "git push" ветки к REMOTES - ORIGIN, если были сделаны какие-либо коммиты? - PullRequest
1 голос
/ 17 апреля 2019

Мне нужен хук, который проверяет операцию git push.

Если создается совершенно новая ветка, и она идентична главной, я бы хотел зацепку, которая мешает подтолкнуть ее к удаленному источнику. Как только первая фиксация в этой ветви сделана, тогда возможен толчок к источнику.

В принципе, я хочу избежать этой ситуации

$ (master) git checkout -b ticket-abc master

$ (ticket-abc) git push origin ticket-abc

Я бы хотел заблокировать эту вторую строку, если нет коммитов, связанных с этой новой веткой. Есть ли способ справиться с этим с помощью git hooks?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Крюк pre-push может быть принят.

#!/bin/bash

master_sha=$(git rev-parse refs/heads/master)
while read local_ref local_sha remote_ref remote_sha;do
    if [[ "${local_sha}" = "${master_sha}" ]];then
        echo error: ${local_ref} points at the same commit with master
        echo error: push failed
        exit 1
    fi        
done
exit 0

Но меня немного беспокоит стабильность местного master. Если он случайно обновляется, ловушка не может обнаружить его изменение и, следовательно, не может завершить толчок, как ожидалось.

0 голосов
/ 17 апреля 2019

Я бы пошел с update ловушкой на стороне сервера:

Хук выполняется один раз для каждого обновления, которое будет обновлено, и принимает три параметра:

  • имя обновляемой ссылки,
  • старое имя объекта, сохраненное в ссылке,
  • и имя нового объекта, которое будет сохранено в ссылке.

Тогда я бы сделал что-то вроде этого:

#!/bin/sh

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

master=$(git rev-parse refs/heads/master)

if [ "$newrev" = "$master" ]; then
    echo "Rejected: $refname has no new commits compared to master" >&2
    exit 1
fi

exit 0

Здесь мы просто сравниваем SHA-1 коммита (newrev), на который ссылается перемещаемая ветвь (refname), с SHA-1 коммита, на который ссылается master. Если они равны, мы выходим с кодом ошибки, тем самым предотвращая создание этой конкретной ветви на сервере.

Из документации :

Непосредственно перед обновлением ссылки на удаленном репозитории, ловушка обновления вызывается. Его статус выхода определяет успех или неудачу ref update.

...