From 0c7fee73a6417d4c94ee8646965b0de3f247d394 Mon Sep 17 00:00:00 2001 From: Ivan Vasilev Date: Wed, 26 Aug 2026 20:40:10 +0300 Subject: [PATCH] =?UTF-8?q?release.sh:=20split-=D0=B2=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BB=D0=BE=D0=B2=D0=B8=D0=BD=20=D1=8F?= =?UTF-8?q?=D0=B4=D1=80=D0=B0=20=D0=B4=D0=BB=D1=8F=20git=20subtree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit core/browser → dist/browser, core/server → dist/server. Продукты тянут каждую в свой prefix; ветки производные и руками не правятся. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz --- package.json | 1 + scripts/release.sh | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100755 scripts/release.sh diff --git a/package.json b/package.json index 94a5ecf..32ec469 100644 --- a/package.json +++ b/package.json @@ -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" }, diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..33fc1a6 --- /dev/null +++ b/scripts/release.sh @@ -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 </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