Как сохранить публичные и частные версии репо? git в синхронизации?

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

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

Ответ 1

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

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

Если вы случайно нажмете свою частную ветку, вы можете удалить ее в удаленном репозитории (если это не запрещено), используя "git push <remote> : refs/heads/< private-branch > " (помните об этом: нажмите пустое значение на удаленную ветку). Вы можете защитить от случайного нажатия своей частной ветки с помощью крючков на удаленной стороне, см., Например, update-paranoid пример hook в 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 -----/

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

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

[remote "private"]
        url = [email protected]:/srv/private/git/repo.git
        push = +:

" Частный репозиторий" - открытый публичный репозиторий, доступный только избранным людям, например, он доступен для извлечения только через SSH. Он имеет только ветки, которые готовы, т.е. "Публичные" и 'private' ветки; либо те ветки присутствовали при создании репозитория "private", либо были явно нажаты ( "git push private <branch> " ) из "рабочего" репозитория. Push из "рабочего" репозитория подталкивает (передает) только соответствующие ветки, т.е. Только ветки "public" и 'private'.

В "Частном репозитории" есть набор привязок post-update или post-receive, который подталкивает "общедоступную" ветвь только к "публичному репозиторию" (см. ниже), если он был нажат на нее (ну, это может быть безусловно безусловным).

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

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

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

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

Ответ 2

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

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

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


Если частный код смешивается с общедоступным, то см. ответ Talljoe или ответ Якуба Нарбского.