Files
maenekoandClaude Opus 5 7977ea6738 release.sh: переставлять split-ветки принудительно
git subtree split -b отказывается двигать существующую ветку, если новый
коммит ей не потомок — после reset в ядре ветка молча оставалась старой,
и продукт тянул устаревшую половину. Ветки производные, поэтому branch -f.

Поймано doctor'ом: сверка поддерева с ядром показала расхождение серверной
половины при совпадающей браузерной.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
2026-08-26 20:45:08 +03:00

60 lines
3.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 <<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