Git частные и публичные репозитории для одного и того же проекта - PullRequest
14 голосов
/ 04 февраля 2011

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

Прямо сейчас у меня есть удаленная ветка настройки частного репо в локальном зеркале публичного репо, и я использую git cherry-pick для копирования интересных коммитов из удаленной ветви частного репо в главную веткуиз публичного репо, который я потом подтолкну.Однако, поскольку частная застройка движется очень быстро, сбор вишни может занять очень много времени.

Есть ли какие-либо предложения по улучшению рабочего процесса?

Кстати, я читал ТАК вопросы # 999064 и # 1807036

Ответы [ 3 ]

8 голосов
/ 04 февраля 2011

Один из возможных вариантов - использовать git rebase -i, чтобы предоставить вам текстовый файл со всеми коммитами в определенном диапазоне в вашем личном кабинете.Скажем, у вас private и public голов и есть 10 новых коммитов в private ветви:

git checkout private
git pull
git checkout -b work
git rebase -i --onto public private^10
# an editor pops up listing the commits.  Just delete the private ones.
git checkout public
git merge work
git branch -d work
git push

Если вы поддерживаете ветку lastsync, подобную этой, в дополнение к вышеприведенному, вы можете заменить приватную ^ 10с lastsync и не нужно отслеживать число оборотов:

git checkout lastsync
git merge private
3 голосов
/ 04 февраля 2011

Хотя то, что я собираюсь предложить, вероятно, похоже на ответ из # 999064 , я попробую.

По сути, вы хотите использовать две ветви. master - ваша основная ветвь, в которую входит вся ваша общественная деятельность. work это ваша частная ветка. Итак, что вы делаете, когда вы хотите, чтобы изменение было также доступно для общественности, вы делаете этот коммит на master. Если фиксация частная, вы делаете это в ветке work.

Хитрость заключается в том, чтобы непрерывно сливать master обратно в work. Таким образом, work будет иметь все изменения master, но master будет содержать только те коммиты, которые были сделаны именно на master.

Итак, что вы получите:

-- work   --------- c -- e ------- h
                   /              /
-- master -- a -- b -- d -- f -- g

master содержит коммиты a, b, d, f, g. work содержит коммиты слияния c (содержит a, b), h (содержит d, f, g) и регулярный коммит e.

e находится только в ветви work, тогда как все остальные коммиты (кроме коммитов слияния) находятся в обеих ветвях.

Пример получения приведенного выше графика:

# on branch master
# changes for a
git add .
git commit -m 'commit a'

# changes for b
git add .
git commit -m 'commit b'

# switch to work
# merge a and b (from master) into work, producing merge commit c
git checkout work
git merge master

# switch to master
# make commits d, f and g
git checkout master
...

# switch to work
# make commit e
# merge d, f and g (from master) into work, producing merge commit h
git checkout work
git merge master

Итак, у вас есть два пульта, public и private. Вы нажимаете work и master на private, но вы нажимаете только master на public.

Надеюсь, это поможет.

1 голос
/ 04 февраля 2011

Я могу придумать один способ.Вы можете сделать публичные репозитории подмодулями основного проекта, а затем разрабатывать их отдельно, но в то же время использовать их из основного проекта.

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

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