git: синхронизация репо, несмотря на прерванную историю - PullRequest
2 голосов
/ 29 июля 2010

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

После точки отсечения частные и публичные репозитории будут полностью синхронизированы. Помимо локальных временных веток, которые не выдвигаются, не будет никаких частных ветвей; ветвь 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 показывает ревизионистскую историю, но я не уверен, как продвигаться вперед. фильтр-ветвь и все такое ... Я только сумел все испортить:)

1 Ответ

2 голосов
/ 29 июля 2010

После того как вы выполните очистку, вы можете создать новый репо только с одним коммитом («чистый» один), который вы отправите в ваш публичный репо.

Кроме этого, у вас будет два репо:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...