que - ¿Cuál es la configuración de git correcta para trabajar con las solicitudes de extracción de GitHub?
guardar credenciales git (4)
Soy consciente de ¿Cómo puedo revisar una solicitud de extracción de GitHub?
Al agregar fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
a .git/config
permite la extracción y el proceso de salida, las acciones de extracción fallan:
[remote "origin"]
url = https://github.com/the/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
Fetch y checkout funciona bien:
$ git fetch origin
... todo bien
$ git checkout -b "pr-123" origin/pr/123
Branch pr-123 set up to track remote branch pr/123 from origin.
Switched to a new branch ''pr-123''
... éxito, consiguió el código!
Pero la tracción falla:
$ git pull
Your configuration specifies to merge with the ref ''refs/heads/pr/123''
from the remote, but no such ref was fetched.
... ha fallado.
Puedo especificar la referencia manualmente:
$ git pull origin refs/pull/123/head
y esto funciona Pero, ¿cómo puedo configurar el archivo de configuración para que:
- Fetch & Checkout todavía funciona, y
- ¿Las siguientes acciones de extracción funcionan sin especificar manualmente la referencia remota?
He encontrado que si edito el archivo de configuración y cambio:
[branch "pr-123"]
remote = origin
merge = refs/heads/pr/123
a:
[branch "pr-123"]
remote = origin
merge = refs/pull/123/head # <-- here is the change
... entonces git pull
funciona bien. ¿Cómo se puede lograr esto sin editar manualmente el archivo de configuración para cada solicitud de extracción?
A partir de las especificaciones de búsqueda no es posible encontrar de forma inequívoca que las referencias remotas refs/remotes/origin/pr/123
rastrean el origin:refs/pull/123/head
porque también es posible el origin:refs/heads/pr/123
. Para ayudarlo, podrías usar un nombre remoto diferente, por ejemplo:
[remote "origin-pr"]
url = <same as for origin>
fetch = +refs/pull/*/head:refs/remotes/origin-pr/pr/*
Luego, git checkout con el nombre explícito de la sucursal (que debería estar disponible en las GUI) podría crear una referencia de seguimiento correcta:
$ git checkout -b pr/123 origin-pr/pr/123
[branch "pr/123"]
remote = origin-pr
merge = refs/pull/123/head
Sin embargo, parece que no es posible hacer funcionar un simple git checkout br/123
:
$ git checkout pr/123
error: pathspec ''pr/123'' did not match any file(s) known to git.
Creo que encontré una solución, y es increíblemente simple: ¡el orden de las líneas con fetch = +refs...
importa!
Cambié:
[remote "origin"]
url = https://github.com/the/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
a:
[remote "origin"]
url = https://github.com/the/repo.git
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
fetch = +refs/heads/*:refs/remotes/origin/*
(últimas dos líneas intercambiadas)
Ahora todo funciona ( fetch
, checkout
, pull
).
Todavía estoy esperando ver algunos (des) problemas esperados con esta configuración, pero hasta ahora todo bien ...
Solo has conseguido ramas, no solicitudes de extracción. Agregue esto a su configuración:
fetch = +refs/pull/*/head:refs/pulls/origin/pr/*
Después de eso, puede verificar una rama que apunta a una referencia de PR remota:
git checkout -b "pr-123" pulls/origin/pr/123
En general, puede consultar una referencia si la ha buscado desde el control remoto, así que mire a través de la salida del comando git fetch
y busque el nombre de referencia de la RP. Eso es lo que debes poner en el comando de checkout
. Deberías ver algo como:
[new ref] refs/pull/123/head -> refs/pulls/origin/pr/123
Tenga en cuenta que puede sustituir la parte de pulls
por cualquier prefijo personalizado. Ahora puede crear una rama y señalarla a pulls/origin/pr/123
, que es equivalente a refs/pulls/origin/pr/123
(ver git refspec doc ).
Una forma correcta es con hub ! :)
$ brew install hub
$ hub checkout https://github.com/github/hub/pull/123
...
$ hub pull
Already up-to-date.
Tiene utilidades adicionales para trabajar con solicitudes de extracción de Github, como
hub pull-request