Работая синхронно с SVN upstream

Я работаю над проектом, который использует код из проекта OpenSource. Одно из требований состоит в том, чтобы отправить как можно больше кода обратно в апстрим.

Удаленный проект использует Subversion (не очень хорошо).

Моя текущая настройка выглядит так:

[Remote SVN] (git svn fetch)-> [My public Git] <-(push/pull)-> [My dev. Git]
                                    VV
                                  (pull)
                                    VV
                               [Testing grid]

РЕДАКТИРОВАТЬ 11.7. - переформулировал вопрос

Моя проблема - сосуществование моего локального публичного репо и svn upstream.

Я должен предоставить 3 государственных филиала:

  • консервативная конюшня
  • экспериментальная конюшня
  • развитие

Эти ветви теперь линейны (развитие становится экспериментально стабильным, а экспериментальное становится консервативным), но целью является стандартный трехсторонний подход с объединением. Из-за их публичного характера я не могу перебазировать эти ветки.

Теперь, полностью ортогонально этому, я пытаюсь как-то упростить отправку патчей в апстрим. Выкапывать их из моих веток медленно и подвержено ошибкам.

Мой типичный текущий рабочий процесс:

  • реализовать некоторые функции в верхней ветке разработки
  • функция тестирования и исправления
  • тестировать и исправлять другие функции, нарушенные этой новой функцией (на самом деле часто бывает)
  • определить, может ли это быть что-то, что может быть принято в апстриме или нет (30:60 да: нет)
  • сделать что-нибудь об этом (я обычно просто пишу новый TODO)

Другая проблема с апстримом - это то, что они принимают патчи в разные ветки (мои публичные ветки основаны на их стабильной ветке). Как только патчи достигают стабильной ветки, я могу просто забыть, что они существуют, но пока это не произойдет, мне все еще нужно хранить их локально.

4 ответа

Решение

git svn Документация рекомендует следующий рабочий процесс при работе с ветками Subversion:

 # Клонировать репо (как git clone):
git svn clone http://svn.example.com/project -T trunk -b ветки -t теги

# Добавить svn: игнорировать настройки в файле git exclude по умолчанию:
git svn show-ignore >>.git / info / exclude

# Просмотр всех веток и тегов, которые вы клонировали:
git branch -r

# Создать новую ветку в SVN
ГИТ СВН филиал Уолдо

# Сбрось своего хозяина на Уолдо:
git reset --hard remotes / waldo

# локальные изменения
мерзавец добавить...
мерзавец совершить...

# вытащить изменения на текущей ветке
git svn rebase

# отправить изменения в Subversion
git svn dcommit

# проверить наличие новых веток
git svn fetch 

Приведенный выше рабочий процесс предназначен для непрерывного изменения в одной ветви Subversion, которой вы можете позволить себе роскошь бита коммита, но манипулирование несколькими активными ветками Subversion и git немного сложнее.

Чтобы отследить ветку Waldo хранилища Subversion, начните с

 git checkout -b Waldo-SVN Remotes / Waldo 

Суффикс -svn позволяет избежать предупреждений в форме

 предупреждение: refname 'waldo' неоднозначно. 

а также чтобы напомнить вам, что эта ветка git предназначена для отслеживания ветки Subversion. Всегда держите изменения в этих ветках линейными!

Чтобы обновить waldo-svn, запустите

 git svn rebase 

Это извлечет изменения из Subversion и перебазирует любые локальные изменения поверх них. Он также достаточно умен, чтобы распознать, когда одно из ваших локальных изменений было принято дословно: оно будет заменено коммитом Subversion и будет иметь строку, начинающуюся с git-svn-id: ... в его сообщении фиксации.

Когда сопровождающие верхнего уровня изменяют содержимое и структуру ваших исправлений (например, изменяя код, разбивая исправление на несколько коммитов Subversion или объединяя несколько исправлений в один коммит), вы получаете удовольствие, решая конфликты и пытаясь распутать беспорядок.

Для полной общности, держите ваши ветки -svn в git чистыми (без изменений) и создавайте ветки проблем из веток -svn. Чтобы отправить патч, используйте

 Git Diff Уолдо-SVN Уолдо-Fix-Фробникатор 

Тогда когда ты git svn rebase чтобы догнать репозиторий Subversion, вам нужно просмотреть журнал и принять решение о соответствующем расположении веток вашей проблемы, что-то вроде GTD для git.

Я не совсем уверен, что понял вашу проблему, но я думаю, что вы можете искать git stash,

Я не уверен, насколько сильно ваши функции связаны с вышестоящим кодом, но вы, возможно, могли бы разделить "ядро" вышестоящего потока, которое вы поддерживаете отдельно от ваших дополнений. Это действительно работает, только если вы можете разбить кодовую базу.

Вы действительно не дали понять, что вы хотите сделать. Ссылаясь на ваше утверждение, что "(поддержание отдельной ветви для каждой функции, следовательно, нетривиально)", я могу только удивляться, почему вы думаете, что это должно быть тривиально. Два патча, которые взаимно зависят друг от друга, должны быть либо одним патчем, либо, по крайней мере, на одной ветви. Патч B, который зависит от A (но не наоборот), должен быть либо на ветви с A, либо на ветви с родительским коммитом на ветви A.

Теперь, если вы хотите иметь "четкий обзор" того, где ваши патчи находятся в восходящем потоке, это сводится к сохранению локальной копии всех вышестоящих ветвей. Я не вижу, в чем проблема с этим. Вам действительно нужно быть точным, если вы хотите более точный ответ.


Хорошо, теперь это легче решать.

У тебя две проблемы.

(1) получает коммиты форка, которые никогда не идут вверх по течению от вашей основной ветки разработки и в ветку форка, как только вы понимаете, что никогда не отправляете их обратно.

Сделайте ветку вилки. Как только вы поймете, что функция не возвращается, потяните за ветку, удерживающую вилку. затем git revert функция fork для применения патча, отменяющего функцию из local-*. Повторите по мере необходимости.

(2) Вы беспокоитесь о том, что произойдет с патчем в апстриме?

Вы действительно не должны отслеживать, применили ли они ваш патч к дистанционно-стабильной (далее r-стабильной) версии. Вы не потеряете патч в L-stable, если вы выйдете из r-stable и они еще не применили патч. Единственная возможная проблема заключается в том, что в коде из патча будут конфликты слияния, но вы не сможете обойти это. Как только они применят патч, он будет либо выглядеть точно так же, как вы разрешили конфликты слияния (в этом случае вы не получите различий от этого при извлечении патча из R-stable), либо они будут сливаться другим способом., и вы получите конфликт слияния и получите возможность принять решение оставить их или свой путь. Просто помните, что если вы хотите сохранить свой путь, вы будете отказываться от r-stable. Один из вариантов - перенести "свой путь" на развилку и сохранить свой путь на локальном *.

Другие вопросы по тегам