Clone do GitHub da solicitação de recebimento?


Respostas:


87

Você pode clonar a ramificação desejada usando a -bopção e a solicitação pull:

git clone https://github.com/user_name/repo_name.git -b feature/pull_request_name dir_name

No seu caso, a ramificação que você deseja clonar é a ramificação de origem da solicitação pull ( feature/mongoose-support):

git clone https://github.com/berstend/frappe.git -b feature/mongoose-support ./mongoose-support

112

A maneira mais fácil de fazer isso é assim:

git fetch origin pull/2/head
git checkout -b pullrequest FETCH_HEAD

Agora você estará em uma nova ramificação que está no estado da solicitação de recebimento.

Você pode configurar um alias executando

git config --global alias.pro '!f() { git fetch -fu ${2:-origin} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f'

Agora você pode fazer o checkout de qualquer PR executando git pr <pr_number>, ou git pr <pr_number> <remote>se o seu github remote não tiver esse nome origin.


49
Melhor: git fetch origin pull/<#>/head:<local_branch_name>( via )
schlamar

5
Eu encontrei-me fazer referência a esta resposta tantas vezes, então eu preso esta no meu .gitconfigarquivo sob [alias]: pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f". Dessa forma, basta digitar git pr upstream 62e, em seguida, sei que estou em um novo ramo da PR # 62 a montante! Se você sempre usa, originpode codificá-lo em vez de $1, mas isso muda para mim.
matt ---

@ Matt que pressupõe que você tenha um alias para check-out chamadoco
Michael McQuade

43
git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH

por exemplo:

$ git fetch origin pull/611/head:pull_611
$ git checkout pull_611

Faça alterações, confirme com elas, PUSH e abra um novo PR do seu fork no GitHub


como posso mesclar essas ramificações localmente? Eu apenas clonei e obtive uma solicitação pull não imersa como acima você fez. E tentei o nome da filial do checkout.
Erginduran 17/05/19

17

Você pode seguir as instruções nesta lista para poder verificar o controle remoto diretamente sem precisar descobrir seu repositório e ramificação.

Exemplo de uso

Para um dos meus projetos (github3.py), tenho o seguinte no meu github3.py/.git/config

[remote "github"]
    fetch = +refs/heads/*:refs/remotes/github/*
    fetch = +refs/pull/*/head:refs/remotes/github/pr/*
    url = git@github.com:sigmavirus24/github3.py

A primeira linha é o padrão para cada controle remoto, com a exceção githubsubstituída pelo nome do controle remoto. O que isso significa é que os chefes remotos (ou os chefes das filiais nesse servidor) são "mapeados" para controles remotos locais prefixados por github/. Então, se eu fiz git fetch githube tinha uma filial no GitHub que já não foi notado localmente na minha máquina, seria baixar o ramo e eu poderia mudar para ele assim: git checkout -t github/branch_name.

A segunda linha faz a mesma coisa, mas faz para solicitações pull em vez de ramos git padrão. É por isso que você vê refs/pull/*/head. Ele busca o cabeçalho de cada solicitação pull no GitHub e o mapeia github/pr/#. Portanto, se alguém enviar uma solicitação pull e estiver numerada 62 (por exemplo), você faria:

git fetch github
git checkout -t github/pr/62

E então você estaria em uma filial local chamada pr/62(assumindo que ela ainda não existisse). É legal e significa que você não precisa acompanhar os controles ou ramificações de outras pessoas.


2
Por que não? Explica exatamente como fazer isso de maneira conveniente e eficiente.
Ian Stapleton Cordasco

Porque eu sou um noob e esse documento é difícil de entender. Eu nunca teria conseguido de "não conseguir" para git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_cloneo documento principal.
Fresheyeball

6
O que o documento gist faz é adicionar um conjunto extra de informações (refs ou referências) para buscar no GitHub. Quando você git fetch githubpode, então você pode git co -t github/pr/#. Isso evita que você precise copiar e colar o URL remoto, descobrir o nome do ramo, etc. Você recebe nomes de galhos bem nomeados, concisos e precisos, sem o incômodo extra. Mas eu entendo que isso pode parecer esmagador.
Ian Stapleton Cordasco

Ah legal. Eu não sabia disso +1! Você pode me dar um exemplo totalmente qualificado?
Fresheyeball

@ sigmavirus24 muito obrigado pela informação; Gostaria de saber se existe um truque semelhante para bitbucket?
Petr Kozelka

8
git clone git://github.com/dweldon/frappe
cd frappe
git pull origin pull/2/head

Como posso buscar uma solicitação pull não imergida para uma ramificação que não possuo?


1
Nota git pullcria uma mesclagem na ramificação atual; geralmente para um PR que você deseja obter apenas git fetcho código do autor original (ele fica acessível como FETCH_HEAD). Se você deseja uma mesclagem, vale a pena mencionar pull/2/merge(em vez de pull/2/head) - isso faz com que o GitHub lhe dê o commit de mesclagem exato que aconteceria se você clicasse no botão [Mesclar] agora.
Beni Cherniavsky-Paskin

6

Quando um usuário envia uma solicitação de recebimento, está solicitando que algumas alterações sejam mescladas de uma ramificação no clone de uma bifurcação para o repositório de outro usuário.

As alterações desejadas podem ser obtidas na origem da solicitação de recebimento. Para fazer isso, clone o repositório do usuário ( git://github.com/berstend/frappe.git) e verifique a ramificação na qual ele criou a solicitação pull ( feature/mongoose-support).


1

Depois de instalar o git-extras

(cd /tmp && git clone --depth 1 https://github.com/tj/git-extras.git && cd git-extras && sudo make install)

Você pode simplesmente usar git pr

$ git pr 62 [remote]


0

Essa solicitação de recebimento mostra as confirmações do fork da pessoa para que você possa ver que ele está enviando as alterações da feature/mongoose-supportramificação.

Você pode clonar seu repositório e fazer checkout desse ramo


0

Para mim, era tão simples quanto

git fetch origin pull/4/head

Onde 4foi encontrado aqui:

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.