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": {
|
||||
"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"
|
||||
},
|
||||
|
||||
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