Концепции Git и GitHub: локальное рассмотрение обновленных запросов на извлечение
Я следую общей структуре OSS:
- удаленный репозиторий OSS, размещенный на GitHub
- форк удаленного репозитория OSS к моему удаленному репозиторию
- клон форка в моем удаленном репозитории для создания локального репозитория
Таким образом, участник должен создать новую ветку локально, отправить изменения в свой удаленный репозиторий, а затем открыть запрос на извлечение в удаленный репозиторий OSS.
Это работало хорошо. Тем не менее, основная проблема возникает, когда я пытаюсь просмотреть пулл-запрос другого участника, поигравшись с ним локально.
Итак, я получил запрос на извлечение, сделанный в удаленный репозиторий OSS, с помощью этой команды:
git fetch upstream pull/<PR#>/head:<branchName>
с последующим git checkout <branchName>
и это было успешно. Я поиграл с пиаром и просмотрел его на GitHub. Затем участник обновил PR, отправив новые коммиты в свою ветку (на своем удаленном репо), что автоматически отразилось на PR.
Теперь я хочу получать обновления локально, чтобы я мог попробовать их снова. Я понимаю, что моя копия ветки PR не отслеживает удаленную ветку по умолчанию, поэтому я попытался настроить ее для отслеживания PR:
git branch --set-upstream upstream/pull/<PR#>/head:<branchName>
как, как я сделал, когда я впервые получил ветку. Тем не менее, я получил ответ, что
ошибка: запрошенная ветка upstream 'pull//head:' не существует
Я попробовал еще раз с:
git branch --set-upstream-to upstream/pull/<PR#>/head:<branchName>
что также не удалось с той же ошибкой.
Тогда, подумал я, это потому, что PR - это "отражение" ветки в чьем-то удаленном репозитории, поэтому, если я хочу отслеживать ветку восходящего потока, я должен отслеживать из удаленного репозитория этого человека?
Поэтому я добавил удаленный репозиторий участников как удаленный и попытался снова:
git branch --set-upstream-to <newRemote> <branchName>
и я все еще сталкивался с той же ошибкой.
Я сделал поиск в Google, и я нашел это, но я не хочу получать все запросы на получение. Я также нашел ссылки, как эта, но нет, не помощь, которая мне нужна там.
Кто-нибудь может указать, что не так с тем, что я делаю сейчас? Спасибо!
Изменить: Есть ли более простой способ сделать что-то кроме того, что было предложено Мариной Лю - MSFT ниже?
2 ответа
Вы можете использовать любой из следующих вариантов, чтобы обновить PR в локальном репо.
Вариант 1: удалите локальную исходную ветку и заново создайте обновление
Как вы используете команды, чтобы получить исходную ветку PR локально:
git fetch upstream pull/<PR#>/head:<branchName>
git checkout <branchname>
Если PR обновлен (новые коммиты передаются в репо форка), вы можете удалить и восстановить его:
git checkout master
git branch -D <branchname>
git fetch upstream pull/<PR#>/head:<branchName>
git checkout <branchname>
Вариант 2: добавить репо в качестве удаленного для вашего локального репо
Вы можете добавить репо в качестве удаленного для вашего локального репо с помощью
git remote add fork1 <URL for the fork repo> -f
Затем вы можете создать локальную ветвь для исходной ветки PR:
git checkout -b <branchname> fork1/<branchname>
Если PR был обновлен, вам просто нужно выполнить следующие команды, чтобы получить обновление:
git fetch fork1
git checkout <branchname> #If HEAD is not on the <branchname>
git reset --hard fork1/<branchname>
Проблема - или, по крайней мере, первая - здесь заключается в том, что вы не можете использовать восходящий поток для ссылки на ссылку на запрос GitHub.
В Git восходящий поток на ветке состоит из двух частей:
- Название пульта, например
origin
- Название ветки на этом пульте, например
master
Git соединяет эти два, чтобы получить refs/heads/master
- это имя на пульте, - затем пропускает эту строку через fetch
настройки для пульта. Стандарт fetch
настройка для пульта имени origin
является +refs/heads/*:refs/remotes/origin/*
, так что если восходящий поток в настоящее время настроен на пару < origin
, master
> имя, которое Git ищет в вашем собственном репозитории: refs/remotes/origin/master
, которое является вашим именем удаленного отслеживания для их master
,
Обратите внимание на предположение, что имя на пульте начинается с refs/heads/
,
Фактическое имя ссылки на GitHub начинается с refs/pull/
не refs/heads/
, так что полное имя коммита, который вы хотите получить для запроса #123: refs/pull/123/head
, Там нет никакого способа записать это, что начинается с refs/heads/
потому что это не название ветки.
Теперь вы можете - как предложено в первой ссылке - добавить дополнительный fetch
установка:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
что вызывает их refs/pull/123/head
общаться с вашим refs/remotes/origin/pr/123
, В зависимости от вашей конкретной версии Git, иногда это или даже в основном работает. Некоторые версии Git иногда запутываются. Если вы попробуете это, и это сработает для вас, это замечательно, просто будьте готовы исправить небольшую неразбериху, если вы по какой-то причине обновляете или понижаете версии Git.
Псевдонимы, найденные по вашей второй ссылке, лучше. Они извлекаются из одного конкретного запроса извлечения, создавая имя локальной ветви (или перезаписывая его, если оно уже существует), это немного опасно, но пока вы не называете свои собственные ветви pr/integer
с тобой все будет в порядке). Вы могли бы улучшить их, написав настоящий git-pr
скрипт, который создает локальную ветвь - обязательно используйте формат полного имени, refs/heads/pr/number
, чтобы гарантировать правильность - и устанавливает некоторую дополнительную информацию, чтобы, когда вы находитесь в этой ветви, git pr
обновляет ветку автоматически.
(Если у меня будет свободное время, я мог бы написать свой собственный сценарий, потому что это было бы очень удобно.)