Как преобразовать клон git только для чтения из github в разветвленный

79

Время от времени я сталкиваюсь с этой проблемой.

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

git clone git://github.com/rails/rails.git

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

Помните, когда я клонировал, я клонировал не разветвленную версию, а версию только для чтения.

Это не значит, что я против разветвления. Просто иногда я думаю, что просто собираюсь просмотреть, а потом хочу что-то добавить.

Ник Вандербильт
источник
Я хотел бы проверить и посмотреть, работает ли мой ответ для вас или вам все еще нужна дополнительная информация. Если вам нужны дополнительные объяснения или разъяснения, дайте мне знать, и я постараюсь вам помочь. Если нет, вы можете принять ответ, чтобы указать, что на вопрос дан адекватный ответ.
Брайан Кэмпбелл

Ответы:

112

Когда вы клонируете репо, он автоматически устанавливает удаленный вызов, originкоторый ссылается на репо, которое вы клонировали. Теперь это указывает на вышестоящий проект Rails, но вам нужно создать свой собственный форк, на который вы можете нажимать, а затем настроить пульт, который указывает на него, чтобы вы могли нажимать на него.

Первый шаг - нажать кнопку «Форк» на странице вышестоящего проекта GitHub (рисунок из инструкций GitHub по разветвлению ):

Кнопка вилки GitHub

Как только вы это сделаете, найдите и скопируйте URL-адрес этого репо. Убедитесь, что вы используете URL-адрес SSH, у которого есть доступ для чтения и записи. Это должно быть что-то вроде git@github.com:nadal/rails.git, если ваше имя пользователя nadal.

Теперь вы можете создать пульт, который позволяет Git отслеживать удаленный репозиторий, извлекая из него или отправляя в него, в зависимости от вашего доступа. Вы можете либо заменить originна тот, на который вы будете нажимать (сколько людей настроили его), либо оставить originуказание на восходящий поток и вместо этого создать новый пульт. Я покажу, как сделать первую настройку; со вторым должно быть легко понять.

Чтобы originуказать на свою вилку на GitHub, вы, вероятно, захотите оставить где-нибудь ветку восходящего потока, поэтому переименуйте ее в upstream:

git remote rename origin upstream

Теперь создайте новый пульт, указывающий на вашу вилку:

git remote add -f origin git@github.com:nadal/rails.git

И теперь вы сможете нажать на новую вилку:

git push origin master

Если вы довольны изменениями, внесенными в GitHub, и хотите, чтобы кто-то из команды Rails их рассмотрел, у вас есть два варианта. Один из них - отправить запрос на перенос с помощью GitHub; см. там документацию, как это сделать. Однако, если у вас есть только один или несколько небольших патчей, команда Rails предпочтет, чтобы вы создали билет Lighthouse и прикрепили свой патч; см. инструкции по участию в Rails для получения дополнительной информации.

edit Вот диаграмма, показывающая, что происходит. Вы просто клонировали вышестоящий репозиторий rails; так что теперь у вас есть свой собственный репозиторий на вашей собственной машине, которая относится к , git://github.com/rails/rails.gitкак origin:

Github: git: //github.com/rails/rails.git
                    ^
                    |
Пульты: origin
                    |
Ваша машина: рельсы /

Вот что вы получите, если разветвите, а затем клонируете вилку:

Github: git: //github.com/rails/rails.git <- git@github.com: nadal / rails.git
                                                           ^
                                                           |
Пульты: origin
                                                           |
Ваша машина: рельсы /

Если вы последуете моим инструкциям, вот что вы получите:

Github: git: //github.com/rails/rails.git <- git@github.com: nadal / rails.git
                        ^ ^
                        | |
Пульты: исходное происхождение
                        | |
Ваша машина: \ ------------------------------- рельсы /

Это похоже на версию, которую вы получаете путем разветвления, за исключением того, что у нее также есть upstreamпульт, поэтому вы можете отслеживать официальные изменения и объединять их в свой код (если вы создали разветвленную версию, вы, вероятно, захотите добавить upstreamпульт как хорошо).

Брайан Кэмпбелл
источник
Возможно, вы на самом деле не захотите форкнуть, если, как говорится в оригинальном постере, он иногда может захотеть сохранить некоторую работу без какой-либо ссылки на оригинал.
Adam Dymitruk
1
@adymitruk Нет, ОП упомянул, что иногда он клонирует исходное репо без разветвления, но потом хочет внести свой вклад. Он специально упомянул, что хотел бы внести свои изменения в разветвленную версию Rails. Он ничего не сказал о желании сохранить работу без ссылки на оригинал.
Брайан Кэмпбелл
он может захотеть внести свой вклад в реальный проект, тогда, если он не хочет форкнуть ... как бы маловероятно это было.
Адам Димитрук
Спасибо за ответ и извиняюсь за задержку с моей стороны. Как я уже говорил, я не развивал рельсы. У меня просто клон рельсов. Однако ваш ответ предполагает, что я сначала развил рельсы. Я правильно понял?
Ник Вандербильт,
4
@Nadal Мой ответ не предполагает, что вы уже создали форк. Мой ответ объясняет, как преобразовать ситуацию, в которой вы только что клонировали репо, в ситуацию, в которой вы можете протолкнуть свои изменения из локального репо в вилку. Разветвление репо на GitHub просто создает копию на сервере, на которую вы можете отправить; как только вы это сделаете, мои инструкции покажут вам, как указать в созданном вами локальном репо, которое прямо сейчас указывает на официальное репо rails, чтобы вместо этого указывать на вашу вилку. Я добавил диаграмму, чтобы показать, что происходит; Надеюсь, это поможет, дайте мне знать, если у вас возникнут дополнительные вопросы.
Брайан Кэмпбелл
3

Очень простой способ переключиться из клонированного в разветвленный режим - использовать hubоболочку из http://hub.github.com/ .

Когда это будет установлено, просто запустите

hub fork

из вашего клона только для чтения.

Стефан Армбрустер
источник
Прекрасно работает. Форк будет создан с тем же удаленным именем, что и ваше имя пользователя на github.
Zitrax 04
1

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

Адам Димитрук
источник
Как мне добавить еще один пульт. Сожалею. новичок в мире git.
Ник Вандербильт
1
вы можете форкнуть позже, а затем нажать на свое разветвленное репо ... если вы еще не форкнули. Форкинг делает вас вашей собственной «копией» интересующего вас репозитория.
Адам Димитрук
пока вы можете просто создать новое репо на github. Добавьте его как удаленный к тому, который вы клонировали из репозитория rails, и нажмите только на новый. Я думаю, это то, что вам нужно. Разветвление не требуется.
Адам Димитрук
1
git remote add myrepo git: //github.com/myid/mynotforkedrepo.git
Адам Димитрук
вы уже создали себе репо на github (или где-то еще)?
Адам Димитрук
0

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

Свенито
источник
1
Я не понимаю, почему все равно не хотелось бы форк, ведь это всего лишь простой форк! Это не полностью новая версия проекта - просто ваша копия исходного кода, который, как вы надеетесь, объединен. Точно так же, как серия патчей.
альтернатива
1
Возможно, у этого человека нет учетной записи на Github, но он все равно хотел бы внести свой вклад в проект. Они могут клонировать проект, редактировать и либо отправлять исправления, либо свою ветку в исходный проект для включения. Но правда, нет реальной причины не делать форк, если вы можете.
Svenito