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:
@@ -6,6 +6,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"demo": "sh scripts/demo.sh",
|
"demo": "sh scripts/demo.sh",
|
||||||
"new-panel": "node scripts/new-panel.mjs",
|
"new-panel": "node scripts/new-panel.mjs",
|
||||||
|
"release": "sh scripts/release.sh",
|
||||||
"typecheck": "tsc --noEmit",
|
"typecheck": "tsc --noEmit",
|
||||||
"typecheck:server": "tsc --noEmit -p tsconfig.server.json"
|
"typecheck:server": "tsc --noEmit -p tsconfig.server.json"
|
||||||
},
|
},
|
||||||
|
|||||||
Executable
+54
@@ -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
|
||||||
Reference in New Issue
Block a user