🚀 Как случайный коммит сломал мне `git subtree`
Если вы, как и я, новичок в монорепозиториях и 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="[email protected]: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 --force
3. ❌
subtree pull
— это минное поле. Лучше не использовать в CI.Надеюсь, кому-то это сэкономит время ✌️
>>Click here to continue<<