GitHub: Как сделать ветку публичного репозитория приватной?

247

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

zer0stimulus
источник

Ответы:

394

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

Вот полный рабочий процесс (мы сделали это до открытия React Native с открытым исходным кодом ):


Сначала продублируйте репозиторий, как сказали другие (подробности здесь ):

Создайте новый репозиторий (давайте назовем его private-repo) через интерфейс Github . Затем:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

Клонируйте частное хранилище, чтобы вы могли работать с ним:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

Чтобы вытащить новую горячность из публичного репо:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

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


Наконец, чтобы создать частное репо с запросом на извлечение -> публичное репо:

Используйте пользовательский интерфейс GitHub для создания форка публичного репо (маленькая кнопка «Fork» в правом верхнем углу страницы публичного репо). Затем:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

Теперь вы можете создать пул-запрос через интерфейс Github для публичного репо, как описано здесь .

После того, как владельцы проекта рассмотрят ваш запрос на извлечение, они могут объединить его.

Конечно, весь процесс может быть повторен (просто пропустите шаги, где вы добавляете пульты).

Мартин Коничек
источник
2
Почему нельзя просто добавить пустое частное репо в качестве нового пульта к обычному клону публичного репо, а затем нажать на него? Какая будет разница?
Фалько Менге
@FalkoMenge У меня такой же вопрос. Читая git-scm.com/docs/git-clone , звучит так, как если бы нормальный git cloneустановил удаленные ветви отслеживания и, возможно, какую-то другую конфигурацию в клонированном репо, которая вам на самом деле не нужна. В то время как клон --bare просто копирует каталог .git с пульта как есть.
Беннлич
1
Это также подтолкнет частную историю коммитов к публичной ветви?
Сукхиндер Сингх
1
@Sukhjinder Singh Да, последний шаг подтолкнет историю частного коммита к публичному репо. Если вы этого не хотите, вы можете раздавить свои коммиты при слиянии их с публичным репо и нажать один коммит со всеми вашими изменениями. См., Например, stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Мартин Коничек,
1
Я попал на шаг, где я клонировал свой личный репозиторий, а затем внес изменения, а затем подтолкнул. Все сделанные мной изменения остались незамеченными для git. git statusпоказывает все в актуальном состоянии, рабочее дерево чистое, что бы я ни менял. Следовательно, я не могу ничего совершить и подтолкнуть. Я удалил новое частное репо, которое я сделал еще 2 раза, чтобы попытаться сделать это, но продолжал сталкиваться с той же самой проблемой. Какие-либо предложения?
Будет ли
92

Теперь есть еще один вариант (январь-2015)

  1. Создать новый частный репо
  2. На пустом экране репо есть опция / кнопка «импорт» введите описание изображения здесь
  3. щелкните по нему и укажите существующий URL-адрес репозитория github. Опция github не упоминается, но он также работает с репозиториями github. введите описание изображения здесь
  4. СДЕЛАНО
szydan
источник
19
Это работает, хотя и немного по-другому. (Пробовал в августе 2015 года). Я не нашел опцию / кнопку импорта, поэтому погуглил ее и оказался в этом URL. import.github.com/new Здесь вы можете ввести существующий URL-адрес github и нажать кнопку « Проверить» . После проверки вы можете ввести имя вашего нового репо и нажать кнопку «Приват», а затем нажать « Начать импорт»
Shiva
2
Я считаю, что @MattvanAndel означает, что комментарий правильный, а не оригинальный ответ. Я тоже последовал комментарию Шивы, и это сработало. Обратите внимание, что вы НЕ должны сначала создавать локальный частный репозиторий!
Дэвид Х
Если я создаю частную «ветвь» таким образом и хочу снова сделать ее общедоступной, могу ли я это сделать?
Андерс Линден
2
@Shiva Я поддержу вас, если вы сделаете ответ из своего комментария.
Бебби
36

Текущие ответы немного устарели, поэтому для ясности:

Краткий ответ:

  1. Сделайте голый клон публичного репо.
  2. Создать новый приватный.
  3. Сделай толчок зеркала к новому приватному.

Это задокументировано на GitHub: duplicating-a-repository

Stefano
источник
4
Есть ли способ вытащить изменения вверх по течению? Это важно для репо с либеральной лицензией - я сделал свой репозиторий закрытым, но все же хотел бы объединить вышестоящие изменения.
Амарпрабху
2
Да. Вы должны иметь возможность добавить другое хранилище в качестве нового (отслеживающего) удаленного (например, «other-repo»), а затем периодически извлекать и объединять изменения из него (например, «git merge other-repo / stable»).
Стефано
26

Вы должны дублировать репо

Вы можете увидеть этот документ (из GitHub)

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

В следующих случаях репозиторий, к которому вы пытаетесь перейти - например, exampleuser / new-repository или exampleuser / mirrored - должен уже существовать на GitHub. См. «Создание нового хранилища» для получения дополнительной информации.

Зеркальное отображение хранилища

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

Откройте командную строку и введите эти команды:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git
# Mirror-push to the new repository

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

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

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

Как и в случае чистого клона, зеркальный клон включает в себя все удаленные ветви и теги, но все локальные ссылки будут перезаписываться при каждом извлечении, поэтому он всегда будет таким же, как и исходный репозиторий. Установка URL для толчков упрощает отправку на ваше зеркало. Чтобы обновить зеркало, загрузите обновления и отправьте, что можно автоматизировать, запустив задание cron.

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/duplicating-a-repository

bsuttor
источник
Это создает клон репо, но не создает форка в смысле GitHub. Когда вы создаете фактический форк в GitHub, он показывает текст «разветвленный из exampleuser / repository-to-mirror» под именем форка. Он также показывает дерево всех других вилок, когда вы переходите на github.com/exampleuser/new-repository/network/members.
apaatsio
20

GitHub теперь имеет опцию импорта, которая позволяет вам выбирать, что вы хотите, ваш новый импортированный репозиторий публичный или частный

Github Repository import

Yidir
источник
Импорт по-прежнему выполняется в большом хранилище (5 дней), проверка его выполняется намного быстрее, но, возможно, это дополнительные шаги для его обновления. Я полагаю, что медлительность понятна, поскольку она импортирует все, а не только главную ветвь, но хотелось бы, чтобы она была быстрее ...
Лиам Митчелл
1
Я собирался добавить тот же ответ, но спасибо, что сделал это первым. Рад, что Github Бесплатные частные репо доступны с января прошлого года. : D
OBL