Отправить патч в проект Github без клонирования репозитория в Github? - PullRequest
21 голосов
/ 15 января 2012

У меня есть локальный репозиторий, который является полной копией репозитория на Github. Я внес изменение, которое хотел бы внести в первоначальный проект.

Как я могу сделать это без перезагрузки моего проекта на Github? Я не думаю, что открытие вопроса - это правильный путь.

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

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

Если я удалю форк после того, как «зафиксировал» изменение, но оно еще не принято, исчезнет ли мой коммит?

Ответы [ 4 ]

20 голосов
/ 15 января 2012

Вы должны раскошелиться на проект, да.Однако это не означает, что вам нужно снова клонировать весь материал локально .

Объяснение: простой способ просмотра репозитория git - это граф коммитов (он является направленным и ациклическимно это не имеет отношения к этой дискуссии);и все узлы этого графа, т.е. коммиты, имеют уникальный идентификатор во всех репозиториях git в мире .Что касается ветвей, они являются просто символическими ссылками на коммит (на языке git ветка - или тег - называется refspec ).

Кроме того, вы никогда никак не связаны с удаленным репозиторием.Единственная вещь, с которой вы действительно «связаны» - это граф коммитов.У удаленного репозитория просто есть набор refspecs (ветки, теги) ... указывающий на граф фиксации, который у них тоже есть - никому не нравятся висячие ссылки.Когда вы клонируете репозиторий, вы получаете граф фиксации (и связанные с ним деревья) и набор refspecs (т.е. ветви, теги).Refspec указывает на дерево.И это все.

Это означает следующее:

  • у вас есть исходное репозиторий github: график коммитов и связанных деревьев, набор refspecs;
  • вы клонировали его локально: тот же граф коммитов и связанных деревьев, тот же набор ссылок;
  • вы зафиксировали вещи локально: вы добавили в этот граф и связанные деревья и добавили новый наборrefspecs.

ОК, теперь сделайте следующее:

  • клонируйте оригинальное репо на github: тот же граф коммитов и деревьев, что и оригинал;здесь есть refspecs, которому предшествует только удаленное имя, которое по умолчанию равно origin.И что теперь?
  • в вашем локальном репозитории, добавьте ваш форк как удаленный ;
  • push к этой вилке (это будет толкать refspecs и деревья);
  • отправьте запрос на извлечение.

Добавление вашего форка в качестве удаленного так же просто, как:

git remote add myfork git@github.com:youruser/theproject

Вставьте в него свой refspec (ответвление):

git push myfork mybranch

А затем отправьте запрос на извлечение исходному автору.

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

5 голосов
/ 15 января 2012

Да, вы должны разветвить проект, но нет необходимости что-либо клонировать / извлекать / объединять.После того, как вы нажмете кнопку разветвления, выполните

git remote add yourfork git@github.com:<yourname>/<project>.git

и протолкните свою ветку на вилку с помощью

git push yourfork branchname

, затем выполните запрос на извлечение.

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

Нет необходимости объединять что-либо.

2 голосов
/ 15 января 2012

Вы всегда можете отправить файл патча сопровождающему по электронной почте.Ядро Linux создавалось таким образом очень долго.

0 голосов
/ 15 августа 2016

Не возиться с вашей текущей копией репозитория.

  • Создайте патчи с помощью format-patch.
  • Разветвите ветку и клонируйте ее, но не заменяйте свою рабочую копию.
  • Примените патчи с git am к вновь разветвленному проекту, нажмите их и создайте запрос на объединение.

Это не самое удачное решение, но оно предотвращает вас от случайногопотеря ваших изменений.

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