TG Telegram Group & Channel
Одержимый кодом🔥 | United States America (US)
Create: Update:

🚀 Как случайный коммит сломал мне `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.


Надеюсь, кому-то это сэкономит время ✌️

🚀 Как случайный коммит сломал мне `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<<

Одержимый кодом🔥




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)