Я пытаюсь иметь две ветки с двоичными файлами в git - одну "разработку" и одну "стабильную". В ветке разработки могут быть несколько изменений этих файлов, прежде чем я хочу "отпустить" их в стабильную ветвь (и стабильная ветвь имеет эти файлы, переименованные, в случае, если это необходимо).
Я мог бы сделать нормальное слияние, это прекрасно работает, но сохраняет слишком много истории - при вытягивании "стабильной" ветки все промежуточные фиксации из ветки "развития" также вытягиваются (потому что они являются родительскими). Но мы говорим о двоичных файлах, которые не имеют разумной стратегии слияния (кроме их/наших), поэтому фактическая история файлов в ветке разработки бесполезна. Когда я вытягиваю "стабильную" ветвь, я получаю следующее:
X-------------------G stable / / a---b---c---d---e---f---g development
Поскольку у G есть родительский элемент в ветке разработки, я получаю всю историю ветвей разработки (объекты данных для c, d, e, f и g) в моем репозитории, которые меня не интересуют (X то же, что и b, с некоторым переименованием файлов).
Итак, я попытался изменить git merge --squash
изменения от ветки разработки до стабильной ветки. Первые такие слияния и фиксации прошли нормально, результаты были как ожидалось (хороший журнал изменений в сообщении фиксации, никакого отношения к ветке разработки):
X-------------------G stable / a---b---c---d---e---f---g development
После того, как я вытащил эту сжатую стабильную ветвь, я получаю это в своем репозитории, и это то, что я хочу:
a---b---X---G
Но второе слияние не получилось (потому что git не имел возможности узнать, сколько я уже слился и запутался).
- Можно ли каким-либо образом записать слияние, не создавая "слияние" с двумя родителями?
- Или, можно ли сообщить git объединить только определенный "диапазон" ревизий, например, в SVN?
- Или возможно ли обычное слияние без необходимости загружать все ссылки из другой ветки при нажатии?
- Или я должен предоставить пользовательский драйвер слияния для файлов, о которых идет речь, что просто переименовывает "свою" версию в "наш", тем самым разрешая конфликты? Я все еще боюсь, что
--squash
всегда будет пытаться объединить всю историю, вплоть до общего родителя, решая только половину моей проблемы.
Обновление: перезагрузка
Если я правильно понимаю, что это будет правильно, я в конечном итоге получаю следующее:
X stable / a---b---c---d---e---f---g development
Что доставит мне все данные, которые мне не интересны (c, d, e, f), и в качестве бонуса я потеряю информацию о том, что b является стабильной версией в ветке.
Каждая версия разработки добавляет около 5 МБ к размеру репозитория (и переупаковка всего репо сокращает его примерно на 10%), "стабильная" ветвь приходит почти бесплатно (данные уже есть). Я хочу вытащить одну новую ревизию из стабильной ветки, чтобы вытащить только новые 5 МБ, но вместо этого обновление с X до G загружает 25 МБ, потому что я как-то не могу сказать, что меня не интересует содержимое c, d, e и f.