Comment voir quelles branches git tracent quelle branche distante / amont?
je sais que je peux faire git branch --all
et qui me montre à la fois en local et à distance des branches, mais il n'est pas utile en me montrant les relations entre eux.
Comment puis-je lister les branches d'une manière qui montre quelle branche locale suit quelle télécommande?
10 réponses
très bien une commande de porcelaine, pas bon si vous voulez cela pour le script:
git branch -vv # doubly verbose!
notez qu'avec le git 1.8.3, cette branche amont est affichée en bleu (voir " Qu'est-ce que cette branche de suivi (s'il y a lieu) dans le git? ")
si vous voulez une sortie propre, voir réponse d'arcresu - il utilise une commande de porcelaine que je ne crois pas exister à la fois où j'ai écrit cette réponse, donc c'est un peu plus concis et fonctionne avec les branches configurées pour rebase, pas seulement fusionner.
git remote show origin
remplacez "origine" par le nom de votre télécommande.
une alternative à la réponse de kubi est de regarder le fichier .git/config
qui montre la configuration du dépôt local:
cat .git/config
si vous regardez la page de manuel de git-rev-parse
,vous verrez que la syntaxe suivante est décrite:
<branchname>@{upstream}
, par exemple:master@{upstream}
,@{u}
le suffixe
@{upstream}
à un nom de branche (forme abrégée<branchname>@{u}
) se réfère à la branche que la branche spécifiée par branchname est défini pour construire sur le dessus de. Un nom de branche manquant par défaut de l'actuel.
donc pour trouver l'amont de la branche master
, vous feriez:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
pour imprimer l'information pour chaque branche, vous pourriez faire quelque chose comme:
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
# ...
c'est plus propre que parsing refs et config manuellement.
pour la branche current , voici deux bons choix:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
ou
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
cette réponse est aussi ici , à une question légèrement différente qui a été (à tort) marquée comme un duplicata.
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
affiche une ligne pour chaque succursale. Une branche de suivi ressemblera à:
master <- origin/master
un non-tracking ressemblera à:
test <-
pour la branche courante, vous pouvez aussi dire git checkout
(sans n'importe quelle branche). Il s'agit d'une non-op avec des effets secondaires pour montrer l'information de suivi, s'il existe, pour la branche actuelle.
$ git checkout
Your branch is up-to-date with 'origin/master'.
j'utilise cet alias
git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " " -> " ;git branch --set-upstream ; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
puis
git track
basé sur réponse D'Olivier Refalo
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " " -> "
git branch --set-upstream
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
il n'affiche que local avec piste configurée.
Écrire sur un script appelé git-piste sur votre chemin et vous obtiendrez un git piste commande
une version plus élaborée de https://github.com/albfan/git-showupstream
git config --get-regexp "branch\.$current_branch\.remote"
vous donnera le nom de la télécommande qui est tracée
git config --get-regexp "branch\.$current_branch\.merge"
, vous obtiendrez le nom de la branche distante qui est suivi.
vous devrez remplacer $current_branch par le nom de votre branche actuelle. Vous pouvez obtenir que dynamiquement avec git rev-parse --abbrev-ref HEAD
le mini-script suivant combine ces choses. Coller dans un fichier nommé "151960920 , le rendre exécutable, et assurez-vous qu'il est dans votre chemin.
alors vous pouvez dire
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
notez que le nom de la branche distante peut être différent du nom de votre branche locale (bien que ce ne soit généralement pas le cas). Par exemple:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
comme vous pouvez le voir dans le code, la clé pour cela est d'extraire les données de la configuration git. J'utilise sed pour effacer les données.
#!/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"