Предыстория: я нахожусь в процессе очистки проекта перед выпуском его как с открытым исходным кодом. Во время истории кода было много вещей, которые я действительно не хотел бы показывать в общедоступном репозитории (ругань в комментариях, жестко запрограммированные пути, смущающие фрагменты кода), поэтому я хочу, чтобы публика видела базу кода только после точка отсечения для очистки - но я хочу сохранить полную историю в своем личном репозитории.
После точки отсечения частные и публичные репозитории будут полностью синхронизированы. Помимо локальных временных веток, которые не выдвигаются, не будет никаких частных ветвей; ветвь master в обоих репозиториях должна быть одинаковой, за исключением того, что публичная история прерывается в точке отсечения.
Насколько я могу судить, Git требует репозитории с полной историей, поэтому я не могу напрямую выдвинуть мою локальную главную ветку как в публичные, так и в частные репозитории. Я предполагаю, что было бы возможно создать отдельную 'публичную' ветвь и использовать переписывание истории, но это потребовало бы объединения частной ветки с общедоступной, прежде чем отправлять код в репозитории - я хотел бы, чтобы установка, которая требовала как можно меньше ручной работы .
Публичный репозиторий предназначен только для извлечения, а я делаю интеграцию. Частный репозиторий будет размещен на моем собственном linux-сервере, поэтому можно было бы настроить хуки коммитов, которые автоматически объединяются с другим (публичным) репо и затем отправляются в публичное репо. Я надеюсь, что есть более чистое решение - возможно, есть способ структурировать это, о котором я даже не думал.
Заранее спасибо за любые предложения:)
Обновление 1
Пытаясь следовать рекомендации VonC, вот что я получил:
Предположения:
Закрытый репозиторий очищается, фиксируется локально и отправляется на git @ server: private.git.
Публичный репозиторий, созданный с помощью файлов последнего закрытого коммита, фиксируется локально и отправляется на git @ server: public.git.
1) ~/priv$ git remote add public git@server:public.git
2) ~/priv$ git fetch public
предупреждение: нет общих коммитов
(материал обрезан)
* [новая ветка] master -> public / master
3) ~/priv$ git log --format='%H %s'
d2d66cf2861ac7136ee3dc04467781825413b084 Вычищена база кода, готовая к публикации!
9ba0ccf4c819eb85dbe4613caec959b04edfb39a Фиксация # 2
a37c3c645dcdc4d8e5fc7ef3c53727cbf1d903ad Первая (частная) фиксация.
Верхний хеш (d2d66 ...) - это коммит частного руководителя.
4) ~/priv$ git log --reverse --format='%H %s' public/master
090a335746ecb03ea5362909be4969b87a99ab80 Первый публичный коммит!
c43fccdda05319e57498f4f517650f9edbdb942a Вторая публичная фиксация:)
Из-за --reverse самый старый хеш (090a3 ...) находится наверху.
5) ~/priv$ echo '090a335746ecb03ea5362909be4969b87a99ab80 d2d66cf2861ac7136ee3dc04467781825413b084' >> .git/info/grafts
На данный момент, git log public/master
показывает ревизионистскую историю, но я не уверен, как продвигаться вперед. фильтр-ветвь и все такое ... Я только сумел все испортить:)