Me gustaría saber si hay una manera de saber qué sucursal local está rastreando qué sucursal remota en Git.
Estoy usando un servidor remoto, que se llama "origen".
Me gustaría saber si hay una manera de saber qué sucursal local está rastreando qué sucursal remota en Git.
Estoy usando un servidor remoto, que se llama "origen".
Respuestas:
Usando el ejemplo de mi copia de Puppet desprotegida del repositorio Git aguas arriba en Github.com ...
$ git remote show origin
* remote origin
Fetch URL: git://github.com/reductivelabs/puppet.git
Push URL: git://github.com/reductivelabs/puppet.git
HEAD branch: master
Remote branches:
0.24.x tracked
0.25.x tracked
2.6.x tracked
master tracked
next tracked
primordial-ooze tracked
reins-on-a-horse tracked
testing tracked
testing-17-march tracked
testing-18-march tracked
testing-2-april tracked
testing-2-april-midday tracked
testing-20-march tracked
testing-21-march tracked
testing-24-march tracked
testing-26-march tracked
testing-29-march tracked
testing-31-march tracked
testing-5-april tracked
testing-9-april tracked
testing4268 tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Entonces, si tuviera que ejecutar lo siguiente:
$ git checkout -b local_2.6 -t origin/2.6.x
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'
Y finalmente vuelva a ejecutar el git remote show origin
comando nuevamente, veré lo siguiente cerca de la parte inferior:
Local branches configured for 'git pull':
local_2.6 merges with remote 2.6.x
master merges with remote master
git fetch
o git pull
cambios a las sucursales remotas se rastreó en su repositorio clonado. Las ramas locales son solo eso, las ramas locales de las ramas remotas y, por lo tanto, las actualizaciones de las ramas remotas se rastrearán y fusionarán cuando se dé el comando apropiado para hacerlo. Incluyo explícitamente la opción '-t' al hacer la rama local para asegurarme de que rastrea la rama desde la que se originó. Recuerde que una sucursal local también puede rastrear otra sucursal local, por lo que no tiene que ser una sucursal remota.
git remote show remote-name
refieren a "rastrear ramas" (instantáneas de ramas de repositorios remotos). Las líneas de "fusión con" se refieren a las sucursales locales que tienen una configuración de "rama ascendente" (hecha con la opción --track
/ -t
de git branch o git checkout y, por lo tanto, a menudo se confunde con "ramas de seguimiento").
Para todas las sucursales:
git branch -avv
Solo para sucursales locales:
git branch -lvv
Solo para sucursales remotas:
git branch -rvv
muestra todas las ramas, así como el nombre de la rama ascendente.
git branch -lvv
mostrar solo sucursales locales con upstream podría ser útil
git branch -vv
funciona para mí ...
Jeremy Bouse ilustra cómo git remote show
muestra la información de seguimiento . Eso debería ser suficiente si solo desea la información para el consumo humano.
Si planea usar la información en un contexto automatizado (por ejemplo, un script), debe usar el nivel inferior ("plomería") en su git for-each-ref
lugar.
% git remote show origin
* remote origin
⋮
Local branches configured for 'git pull':
master merges with remote master
pu merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu
El git for-each-ref
aprendieron el %(upstream)
token en Git 1.6.3 . Con versiones anteriores de Git, tendrá que extraer la información de seguimiento con git config branch.<name>.remote
y git config branch.<name>.merge
(probablemente usando git for-each-ref
para construir los comandos para cada nombre de sucursal local).
git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
Para una rama en particular, puede usar git rev-parse
con el sufijo @{u}
o @{upstream}
en el nombre de la rama, por ejemplo:
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master
... o para la forma abreviada, agregue --abbrev-ref
$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master
Generalmente puede usar la branch@{upstream}
sintaxis donde se espera una confirmación.
git rev-parse --symbolic-full-name HEAD
vs. git rev-parse --symbolic-full-name HEAD@{u}
¡gracias!
Utilizo el siguiente script de shell (llamado git-tracks
) para mostrar la rama remota que es rastreada por la rama actual:
#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}
echo "${remote:?}/${remoteBranch:?}"
Esto también podría usar lo mencionado git for-each-ref
, pero el acceso directo me pareció algo más simple que filtrar la salida de la rama actual.
set -e
, pero generalmente me quedo con la comprobación explícita. Pero en este caso, es realmente mejor.
git version 1.9.4
. Echos nada :(
.git/config
el archivo también proporcionará la información de la rama de seguimiento como
[remote "Hub"]
url = ssh://xxxx/tmp/Hub
fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
remote = Hub
merge = refs/heads/develop
[branch "Dev1"]
remote = Test
merge = refs/heads/Dev1
[remote "Test"]
url = ssh://xxxx/tmp/gittesting/Dev1GIT
fetch = +refs/heads/*:refs/remotes/Test/*
Necesitaba encontrar la rama remota correspondiente (si la hubiera) para cada rama local dentro de un bucle que actuaba en una lista de las ramas locales. Terminé usando lo siguiente:
git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"
Esto no generará nada (una cadena vacía) para las ramas locales que no tienen una rama remota correspondiente ("someremote / somebranch").
Probar git branch
con opciones :
-r
List or delete (if used with -d) the remote-tracking branches.
-a
List both remote-tracking branches and local branches.
De lo contrario, examine su .git/config
.