remotas - ¿Cómo ver qué ramas de git están rastreando qué rama remota/ascendente?
git push (10)
Basado en la respuesta de Olivier Refalo.
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " $1 " -> " $2
git branch --set-upstream $1 $2
else
echo "-- Local --"
git for-each-ref --shell --format="[ %(upstream:short) != '''' ] && echo -e ''/t%(refname:short) <--> %(upstream:short)''" refs/heads | sh
echo "-- Remote --"
REMOTES=$(git remote -v)
if [ "$REMOTES" != '''' ]
then
echo $REMOTES
fi
fi
Muestra solo local con pista configurada.
Escríbalo en un script llamado git-track en su ruta y obtendrá un comando git track
Una versión más elaborada en https://github.com/albfan/git-showupstream
Sé que puedo hacer git branch --all
y eso me muestra tanto las sucursales locales como las remotas, pero no es tan útil para mostrarme las relaciones entre ellas.
¿Cómo enumero las sucursales de manera que muestre qué sucursal local está rastreando qué remoto?
Mucho un comando de porcelana, no es bueno si quieres esto para scripting:
git branch -vv # doubly verbose!
Tenga en cuenta que con git 1.8.3, esa rama en sentido ascendente se muestra en azul (consulte " ¿Qué es el seguimiento de esta rama (en todo caso) en git? ")
Si desea una salida limpia, vea la respuesta de arcresu : usa un comando de porcelana que no creo que existiera en el momento en que escribí esta respuesta, por lo que es un poco más conciso y funciona con sucursales configuradas para rebase, no solo para fusionar.
Para la rama actual , aquí hay dos buenas opciones:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
o
% git for-each-ref --format=''%(upstream:short)'' $(git symbolic-ref -q HEAD)
origin/mainline
Esa respuesta también está here , a una pregunta ligeramente diferente que fue (erróneamente) marcada como un duplicado.
Para la rama actual, también podría decir git checkout
(sin ninguna rama). Este es un no-op con efectos secundarios para mostrar la información de seguimiento, si existe, para la rama actual.
$ git checkout
Your branch is up-to-date with ''origin/master''.
Si observa la página de manual de git-rev-parse
, verá que se describe la siguiente sintaxis:
<branchname>@{upstream}
, por ejemplo,master@{upstream}
,@{u}
El sufijo
@{upstream}
a un nombre de sucursal (forma corta<branchname>@{u}
) se refiere a la rama que la rama especificada por nombre de rama está configurada para construir en la parte superior. Un nombre de sucursal faltante por defecto es el actual.
Por lo tanto para encontrar el upstream del master
rama, harías:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
Para imprimir la información de cada sucursal, podría hacer algo como:
while read branch; do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [[ $? == 0 ]]; then
echo $branch tracks $upstream
else
echo $branch has no upstream configured
fi
done < <(git for-each-ref --format=''%(refname:short)'' refs/heads/*)
# Output:
# master tracks origin/master
# ...
Esto es más limpio que el análisis de refs y configuración manualmente.
Una alternativa a la respuesta de kubi es echar un vistazo al archivo .git/config
que muestra la configuración del repositorio local:
cat .git/config
Yo uso este alias
git config --global alias.track ''!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f''
entonces
git track
git config --get-regexp "branch/.$current_branch/.remote"
le dará el nombre del control remoto que está siendo rastreado
git config --get-regexp "branch/.$current_branch/.merge"
le dará el nombre de la rama remota que está siendo rastreada.
Deberá reemplazar $ current_branch con el nombre de su rama actual. Puede obtener eso dinámicamente con git rev-parse --abbrev-ref HEAD
El siguiente mini-script combina esas cosas. Péguelo en un archivo llamado git-tracking
, conviértalo en ejecutable y asegúrese de que esté en su ruta.
entonces puedes decir
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
tenga en cuenta que el nombre de la rama remota puede ser diferente del nombre de la rama local (aunque generalmente no lo es). Por ejemplo:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
Como puede ver en el código, la clave para esto es extraer los datos de la configuración de git. Sólo uso sed para borrar los datos extraños.
#!/bin/sh
current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch/.$current_branch/.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch/.$current_branch/.merge" | /
sed -e "s/^.* //" -e "s/refs//.*////")
echo "$current_branch -> $remote/$remote_branch"
git remote show origin
Reemplace ''origen'' con cualquiera que sea el nombre de su control remoto.
git for-each-ref --format=''%(refname:short) <- %(upstream:short)'' refs/heads
mostrará una línea para cada sucursal local. Una rama de seguimiento se verá como:
master <- origin/master
Un no rastreador se verá así:
test <-