Как синхронизировать публичные и приватные версии git-репо? - PullRequest
26 голосов
/ 16 июня 2009

Я выпускаю приложение на Rails с открытым исходным кодом на Github (возможно, MIT). Я также хочу сохранить частную ветку / форк проекта, который мы будем использовать как часть платного сервиса.

Каков наилучший способ организации репо в этом сценарии? И как я могу поддерживать синхронизацию проектов, когда у меня есть обновления, которые должны быть в обоих случаях?

Ответы [ 2 ]

31 голосов
/ 16 июня 2009

Самое простое решение было бы иметь частную ветку в вашем 'частном' репозитории, то есть ветку, которая просто не выдвинута в публичный репозиторий.

Для этого вам, вероятно, понадобится либо указать все ветви, которые вы хотите отправить в общедоступный репозиторий в конфигурации (вместо использования зеркального отражения refspec +refs/*:refs/*), либо осторожно выдвинуть ветви, которые вы хотите опубликовать, и полагаться на поведение Git pushing соответствующие ветви (те, которые присутствуют на удаленной стороне) устанавливают «push.default» в текущее значение по умолчанию «соответствие».

Если вы случайно нажали на свою частную ветку, вы можете удалить ее в удаленном репозитории (если только он не настроен на это), используя "git push <<em> remote >: refs /head / <<em> private-branch > "(чтобы запомнить это: отправьте пустое значение в удаленную ветку). Вы можете защитить себя от случайного нажатия на вашу частную ветку, используя крючки на удаленной стороне, см., Например, update-paranoid пример хука в contrib / examples.


Sidenote: Junio ​​C Hamano, сопровождающий git, отправляет в публичные git-репозитории только указанный набор веток: 'maint', 'master', 'next', 'pu' (предлагаемые обновления) и 'html', 'man', 'todo'; он не публикует кратковременные часто меняющиеся ветви функций.



ПРИМЕР УСТАНОВКИ:

    working repository  ---->  private repository (bare)  ---->  public repository  
    \------ private -------/     \------- protected ------------/     \------- public -----/

" Рабочий репозиторий " - это репозиторий с рабочей областью, в которой вы делаете коммиты, где вы вносите изменения и разрешаете конфликты; хранилище, где вы делаете свою работу. Допустим, он содержит следующие ветки: «общедоступные» с изменениями, которые могут быть опубликованы в мире, «частные», которыми вы не хотите делиться с другими или делитесь ими только с выбранной группой людей, и, возможно, некоторые функциональные ветки, такие как «тикет- 234 'или' add-frobnicator ', которые не готовы даже для просмотра выбранной группой. Это хранилище не пустое, так как оно не опубликовано.

Это будет что-то вроде следующей конфигурации для отправки в «частный» репозиторий. Обратите внимание, что поведение "совпадающих ветвей" здесь установлено явно , см. git-pull manpage:

[remote "private"]
        url = user@example.com:/srv/private/git/repo.git
        push = +:

" Частный репозиторий " является общедоступным открытым репозиторием, доступным только для выбранных людей, например, он доступен для извлечения только через SSH. Он имеет только готовые ветви, то есть «публичные» и «частные» ветки; либо эти ветви присутствовали при создании «частного» репозитория, либо были явно выдвинуты («git push private ») из «рабочего» репозитория. Push из «рабочего» репозитория выдвигает (переносит) только совпадающие ветки, то есть только «публичные» и «приватные» ветки.

«Частный репозиторий» имеет набор хуков post-update или post-receive, который толкает только «открытую» ветку только в «публичный репозиторий» (см. Ниже), если он был перенесен в него (ну, он может толчок безоговорочно).

" Публичный репозиторий " - это общедоступный открытый репозиторий, доступный каждому, например, он размещен на GitHub и / или Gitorious, и / или repo.or.cz, или возможно, он обслуживается по протоколу git:// с использованием git-daemon. Он содержит только «публичную» ветвь и использует update или pre-receive либо для принятия whilelist ветвей (здесь допускается только «публичная» ветвь), либо для отклонения черного списка ветвей (в этом примере толкает к / creation 'private) ветка будет отклонена). Он обновляется автоматически при отправке в «приватный» репозиторий.

Эта настройка может быть слишком сложной для ваших нужд; «частный» репозиторий может не понадобиться в вашем случае. В этом случае конфигурация в «рабочем репозитории» для отправки непосредственно в «публичный репозиторий» будет выглядеть следующим образом:

[repository "public"]
        url = ssh://example.com/srv/git/repo.git
        push = refs/heads/public:refs/heads/public

Надеюсь, этот пример поможет; однако, пожалуйста, прочитайте документацию и не используйте ее вслепую.

3 голосов
/ 16 июня 2009

Если код, относящийся к «части платного сервиса», отделен (т. Е. «В другом каталоге») от кода, представляющего «приложение Rails с открытым исходным кодом», помещенное в общедоступный репозиторий, вы можете:

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

Таким образом, вы работаете со всей системой (общедоступное приложение Rails + частная система оплаты), но переносите только открытую часть в GitHub, и вы можете перенести всю систему (частную + публичную) в другой частный репозиторий (на например, резервный компьютер).


Если личный код смешан с открытым ... тогда см. ответ Таллджо или ответ Якуба Наребски .

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