Якщо припустити, що у віддаленому сховищі є копія гілки розробки (ваш початковий опис описує її в локальному сховищі, але це здається, що він існує і у віддаленому сховищі), ви повинні мати можливість досягти того, що я думаю, що ви хочете, але підхід трохи відрізняється від того, що ви передбачили.
Історія Git заснована на DAG -комітетах. Відділення (та "загальнодоступні" взагалі) - це лише тимчасові мітки, які вказують на конкретні комісії в постійно зростаючій комісії DAG. Таким чином, відносини між гілками можуть змінюватися з часом, але взаємозв'язок між комісіями не має.
---o---1 foo
\
2---3---o bar
\
4
\
5---6 baz
Схоже baz
, заснована на (старій версії) bar
? Але що робити, якщо ми видалимо bar
?
---o---1 foo
\
2---3
\
4
\
5---6 baz
Тепер, схоже baz
, заснована на foo
. Але походження baz
не змінилося, ми просто зняли мітку (і випливає в результаті звисання). А що, якщо ми додамо новий ярлик на 4
?
---o---1 foo
\
2---3
\
4 quux
\
5---6 baz
Тепер, схоже baz
, заснована на quux
. Все-таки родовід не змінився, змінилися лише мітки.
Однак, якщо ми запитували, "чи чинить 6
нащадок вчинення 3
?" (Припускаючи , що 3
і 6
повний SHA-1 здійснюють імена), то відповідь буде «так», то чи bar
й quux
мітки присутні чи ні.
Отже, ви можете задати питання на кшталт "чи натиснута фіксація є нащадком поточного кінця гілки розвитку ?", Але ви не можете надійно запитати "що таке батьківська гілка висунутої фіксації?".
В основному надійне питання, яке, здається, наближається до того, що ви хочете, це:
Для всіх предків, що підштовхуються, (за винятком поточної версії розвитку та її предків), які мають поточну верхівку розвитку як батьків:
- чи існує хоча б одна така комісія?
- чи всі такі вчинки, що здійснюються неповнолітніми?
Що може бути реалізовано як:
pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
echo "'$basename' is missing, call for help!"
exit 1
fi
parents_of_children_of_base="$(
git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
grep -F "$baserev"
)"
case ",$parents_of_children_of_base" in
,) echo "must descend from tip of '$basename'"
exit 1 ;;
,*\ *) echo "must not merge tip of '$basename' (rebase instead)"
exit 1 ;;
,*) exit 0 ;;
esac
Це охопить частину того, що ви хочете обмежити, але, можливо, не все.
Для довідки, ось розширена приклад історії:
A master
\
\ o-----J
\ / \
\ | o---K---L
\ |/
C--------------D develop
\ |\
F---G---H | F'--G'--H'
| |\
| | o---o---o---N
\ \ \ \
\ \ o---o---P
\ \
R---S
Наведений вище код може бути використаний для відхилення H
і S
при прийомі H'
, J
, K
або N
, але він також буде приймати L
і P
(вони включають злиття, але вони не зливаються кінчиком розробки ).
Щоб також відхилити L
і P
, ви можете змінити питання і задати його
Для всіх предків, що підштовхуються, (за винятком поточної версії розвитку та її предків):
- чи є якісь зобов’язання з двома батьками?
- якщо ні, чи має принаймні одна така комісія поточна порада розвивати свою (єдину) батьківщину?
pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
echo "'$basename' is missing, call for help!"
exit 1
fi
parents_of_commits_beyond_base="$(
git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
grep -v '^commit '
)"
case "$parents_of_commits_beyond_base" in
*\ *) echo "must not push merge commits (rebase instead)"
exit 1 ;;
*"$baserev"*) exit 0 ;;
*) echo "must descend from tip of '$basename'"
exit 1 ;;
esac