Якщо припустити, що у віддаленому сховищі є копія гілки розробки (ваш початковий опис описує її в локальному сховищі, але це здається, що він існує і у віддаленому сховищі), ви повинні мати можливість досягти того, що я думаю, що ви хочете, але підхід трохи відрізняється від того, що ви передбачили.
Історія 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