#!/bin/sh # Готовит ветки, из которых продукты тянут ядро через `git subtree pull`. # # sh scripts/release.sh (или npm run release) # # У ядра две половины и два адресата, а `git subtree` работает с одним prefix # за раз — поэтому каждая половина выделяется в свою ветку с собственной # историей: # # core/browser → ветка dist/browser → <панель>/frontend/src/core # core/server → ветка dist/server → <панель>/backend/core # # `git subtree split` переписывает историю выбранного каталога так, будто он # всегда был корнем репозитория. Ветки полностью производные: их не правят # руками и не мержат обратно — правится core/, после чего скрипт гоняется снова. # # Почему subtree, а не копирование: копия затирает любую локальную правку и не # оставляет истории, поэтому «ядро в панели разошлось» выясняется постфактум. # subtree делает настоящий merge — расхождение видно конфликтом в момент # обновления, а правку, сделанную в продукте, можно отдать обратно в ядро # (`git subtree push --prefix=<путь> <ядро> <ветка>`). set -eu here=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) root=$(dirname "$here") cd "$root" if [ -n "$(git status --porcelain)" ]; then echo "release: рабочее дерево грязное — закоммить или спрячь правки" >&2 git status --short >&2 exit 1 fi # `git subtree split -b <ветка>` умеет только создать ветку и отказывается # двигать существующую, если новый коммит ей не потомок, — а после любого # reset/rebase в ядре это ровно так. Поэтому split считает коммит, а ветка # переставляется принудительно: ветки производные, своей истории у них нет. split() { # split <каталог> <ветка> printf 'release: %s → %s\n' "$1" "$2" rev=$(git subtree split --prefix="$1" -q) git branch -f "$2" "$rev" printf ' %s\n' "$(git log -1 --format='%h %s' "$2")" } split core/browser dist/browser split core/server dist/server cat </frontend/src/core $root dist/browser --squash git subtree add --prefix=<панель>/backend/core $root dist/server --squash # дальше git subtree pull --prefix=<панель>/frontend/src/core $root dist/browser --squash git subtree pull --prefix=<панель>/backend/core $root dist/server --squash TXT