Comment voir quelles twigs git suivent quelle twig distante / en amont?

Je sais que je peux faire git branch --all et cela me montre des twigs locales et distantes, mais ce n’est pas très utile pour me montrer les relations entre elles.

Comment puis-je lister les twigs d’une manière qui montre quelle twig locale suit quelle télécommande?

Très bien une commande de porcelaine, pas bien si vous voulez cela pour les scripts:

 git branch -vv # doubly verbose! 

Notez qu’avec git 1.8.3, cette twig en amont est affichée en bleu (voir ” Qu’est-ce que ce suivi de twig (le cas échéant) dans git? “)


Si vous voulez une sortie nette, voyez la réponse de arcresu – elle utilise une commande de porcelaine qui, à mon avis, n’existait pas à l’époque, donc un peu plus concise et fonctionne avec des twigs configurées pour rebaser, 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 d’examiner le fichier .git/config qui montre la configuration du référentiel local:

cat .git/config

Si vous regardez la page de manuel de git-rev-parse , vous verrez que la syntaxe suivante est décrite:

@{upstream} , par exemple master@{upstream} , @{u}

Le suffixe @{upstream} vers un nom de twig (forme @{u} ) fait référence à la twig sur laquelle la twig spécifiée par branchname est configurée. Un nom de twig manquant est celui par défaut.

Donc, pour trouver l’amont du master twig, vous feriez:

 git rev-parse --abbrev-ref master@{upstream} # => origin/master 

Pour imprimer les informations pour chaque twig, vous pouvez 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 # ... 

Ceci est plus propre que l'parsing des références et de la configuration manuellement.

Pour la twig actuelle , 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 également ici , à une question légèrement différente qui a été (à tort) marquée comme un double.

 git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads 

affichera une ligne pour chaque twig locale. Une twig de suivi ressemblera à:

 master <- origin/master 

Un non-suivi ressemblera à:

 test <- 

Pour la twig actuelle, vous pouvez également dire git checkout (sans aucune succursale). Il s’agit d’une opération sans effet avec les effets secondaires pour afficher les informations de suivi, le cas échéant, pour la twig en cours.

 $ 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 " $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' 

puis

 git track 

D’après la réponse d’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 

Il montre uniquement local avec piste configurée.

Écrivez-le sur un script appelé git-track sur votre chemin et vous obtiendrez une commande git track

Une version plus élaborée sur 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 suivie

git config --get-regexp "branch\.$current_branch\.merge"

vous donnera le nom de la twig distante suivie.

Vous devrez remplacer $ current_branch par le nom de votre twig actuelle. Vous pouvez obtenir cela dynamicment avec git rev-parse --abbrev-ref HEAD

Le mini-script suivant combine ces choses. Collez-le dans un fichier nommé git-tracking , rendez-le exécutable et assurez-vous qu’il se trouve sur votre chemin.

alors vous pouvez dire

 $ git tracking ->/ 

notez que le nom de la twig distante peut être différent du nom de votre twig 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é consiste à extraire les données de la configuration git. Je viens d’utiliser sed pour effacer les données superflues.

 #!/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"