Miej zdalne scalanie repozytorium git po naciśnięciu

Co chcę robić:

chcęzakazać każdyscalić zatwierdzenia byćpchnięty do centralnego repozytorium. Thejedyny wyjątek jeśli łączenie odbywa się między gałęziami, które istnieją w centralnym repozytorium. Chcę to wymusić w centralnym repozytorium.

Wyjaśnienie, dlaczego chcę to zrobić:

Uwaga: Jeśli to wyjaśnienie wyrzuci cię z tropu tego, co chcę zrobić, zignoruj ​​wyjaśnienie. Oczywiście cieszę się, że słyszę inne sposoby rozwiązania problemu, który wyjaśniłem poniżej, ale odpowiedź, którą mnie interesuje, dotyczy tego, co chcę zrobić, jak wspomniano powyżej.

Mam centralne repozytorium git z oddziałem, który śledzi kilku programistów. Każdy programista ma pilota skonfigurowanego dla tego oddziału centralnego repozytorium.

Podążamy za synchroniczną polityką zatwierdzania dla tego projektu, więc każdy programista musi przed ponownym naciśnięciem wyposażyć swoją najnowszą pracę w zdalną gałąź HEAD. Chciałbym egzekwować tę politykę, nie zezwalając na to, aby jakiekolwiek zatwierdzenia scalania były kiedykolwiek przekazywane do centralnego repozytorium. Jedynym wyjątkiem jest sytuacja, w której łączenie odbywa się między gałęziami, które istnieją w centralnym repozytorium.

Aby uprościć, nie chcę, aby lokalne gałęzie śledzenia programisty były kiedykolwiek łączone z oddziałem zdalnym. Ale raczej zawsze bazuj na zdalnej gałęzi.

Częściowo wymusiliśmy to na maszynie dewelopera, ustawiając branch.NAME.rebase = true, co pomaga uniknąć problemów, jeśli deweloper używa git pull, jednak potrzebujemy rozwiązania, aby wymusić to w centralnym repozytorium.

Bardzo podstawowym rozwiązaniem byłoby odmówić zatwierdzenia za pomocą komentarza: „Scal gałąź„ NAZWA ”GITURL”, jednak coś bardziej podobnego do sprawdzania, czy wszystkie rodziców zatwierdzenia istnieją w ścieżkach rozgałęzień centralnego repozytorium byłoby bardziej interesujące.

Propozycje? Rozwiązania?

Edytować:

Oto, co mam do tej pory:

#!/bin/sh
read sha1old sha1new refname

# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
  # this was a merge commit
  # $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0

Miejscem, które sprawia kłopoty, jest ustalenie, czy przodkowie dwóch rodziców pochodzą z jednej gałęzi. Ponadto, ponieważ hak przed otrzymaniem jest wywoływany przed aktualizacją jakichkolwiek refów, jeśli push zawiera zatwierdzenia dla dwóch gałęzi, które istnieją w pilocie, w tym scalenie między tymi dwoma gałęziami, to nie mam pojęcia, jakie byłoby rozwiązanie tutaj. .

questionAnswers(1)

yourAnswerToTheQuestion