release.sh: split-ветки половин ядра для git subtree

core/browser → dist/browser, core/server → dist/server. Продукты тянут
каждую в свой prefix; ветки производные и руками не правятся.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
This commit is contained in:
2026-08-26 20:40:10 +03:00
co-authored by Claude Opus 5
parent 18bd05bcbb
commit 0c7fee73a6
2 changed files with 55 additions and 0 deletions
+1
View File
@@ -6,6 +6,7 @@
"scripts": {
"demo": "sh scripts/demo.sh",
"new-panel": "node scripts/new-panel.mjs",
"release": "sh scripts/release.sh",
"typecheck": "tsc --noEmit",
"typecheck:server": "tsc --noEmit -p tsconfig.server.json"
},
+54
View File
@@ -0,0 +1,54 @@
#!/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
split() { # split <каталог> <ветка>
printf 'release: %s → %s\n' "$1" "$2"
git subtree split --prefix="$1" -b "$2" -q
printf ' %s\n' "$(git log -1 --format='%h %s' "$2")"
}
split core/browser dist/browser
split core/server dist/server
cat <<TXT
Готово. В продукте, где панель лежит подкаталогом:
# первый раз
git subtree add --prefix=<панель>/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