Я разветвляю часть (но не всю) проекта с закрытым исходным кодом, чтобы сделать проект с открытым исходным кодом. На данный момент я создал ветку («открытую»), из которой удалил функции, исходный код которых мы нет собираемся открыть.
Теперь я мог в этот момент экспортировать «открытую» ветку и зарегистрировать ее в свежем, пустом репо, который становится выпуском с открытым исходным кодом.
Однако я хотел бы сохранить возможность синхронизации изменений между версиями с открытым и закрытым исходным кодом: т. е. если мы позже исправим ошибку в закрытом исходном коде, то также синхронизируем исправление с версией с открытым исходным кодом (и наоборот, если участник согласен) .
Есть ли способ добиться этого, не публикуя историю «открытой» ветки (т.е. закрытой ветки)?
Поскольку git хранит коммиты в виде наборов изменений, вы можете легко выбирать изменения из одного репо в другое (если, конечно, присутствуют одни и те же измененные файлы и они не слишком сильно отличаются).
Один из способов добиться этого — добавить оба «источника» как удаленные в один клон репо. Затем извлечение всех коммитов с обоих пультов (чтобы у вас были доступные хэши коммитов). Затем вы можете проверить ветку одного удаленного репозитория и выбрать фиксацию другого удаленного, как и любой другой выбор вишни с одним удаленным репо.
Что-то вроде этого в ужасно истолкованном примере:
git clone git://blablabla.git mydoublerepo
cd mydoublerepo
git remote add other git://other.git
git fetch other
git checkout -b other_master -t other/master
git cherry-pick origin/master # cherry-picks the top commit off of the other remote's master branch
Обратите внимание, что вам не нужно создавать для этого отдельный клон, вы можете добавить любое репо в качестве удаленного к любому другому клонированному репо.