Если вы, как и я, новичок в монорепозиториях и
git subtree — вот реальная история, которая может сэкономить вам пару часов жизни.В
MoonShine мы используем монорепу, и каждый пакет (`src/UI`, src/Core и т.д.) синхронизируем с внешними репами через subtree.Как-то я по-быстрому поправил
README прямо в split-репозитории (`moonshine-software/ui`) — и после этого CI перестал работать. git subtree push начал падать, subtree pull выкидывал конфликты. Почему? Потому что история коммитов в split-репо разошлась, и subtree отказался это мержить.🤕 Недавно ситуация повторилась: по определенной причине (привет, Dependabot) в split-репо снова появился внешний коммит — и всё сломалось.
В этот раз я быстро вспомнил, что делать:
🛠 Решение: просто сплитим содержимое в ветку и форсим пуш (сделал себе готовый скрипт):
#!/bin/bash
set -e
REPO_NAME=$1
FOLDER_NAME=$2
REMOTE_REPO="git@github.com:moonshine-software/${REPO_NAME}.git"
REMOTE_BRANCH="3.x"
LOCAL_PREFIX="src/${FOLDER_NAME}"
TMP_BRANCH="repair-split-${REPO_NAME}"
git subtree split --prefix="$LOCAL_PREFIX" -b "$TMP_BRANCH"
git push --force "$REMOTE_REPO" "$TMP_BRANCH:$REMOTE_BRANCH"
git branch -D "$TMP_BRANCH"
📚 Выводы:
1. 🛡 Если split-репо — read-only, защитите ветку от ручных пушей
2. 🤖 Делайте sync только из монорепы через
subtree split + push --force3. ❌
subtree pull — это минное поле. Лучше не использовать в CI.Надеюсь, кому-то это сэкономит время ✌️