Je sais que je peux faire git branch --all
et cela me montre les succursales locales et distantes, mais ce n'est pas très utile pour me montrer les relations entre elles.
Comment puis-je lister les branches d'une manière qui montre quelle branche locale suit quelle télécommande?
Très bien une commande de porcelaine, pas bon si vous voulez ceci pour le script:
git branch -vv # doubly verbose!
Notez qu'avec git 1.8.3, cette branche en amont est affichée dans blue (voir " Quel est ce suivi de branche (le cas échéant) dans git? ")
Si vous voulez une sortie nette, voir réponse d'Arcresu - il utilise une commande de porcelaine qui, à mon avis, n'existait pas à l'époque où j'ai écrit cette réponse. juste fusionner.
git remote show Origin
Remplacez 'Origine' par le nom de votre télécommande.
Si vous consultez la page de manuel relative à git-rev-parse
, vous verrez que la syntaxe suivante est décrite:
<branchname>@{upstream}
, PAR EXEMPLEmaster@{upstream}
,@{u}
Le suffixe
@{upstream}
à un nom de branche (forme abrégée<branchname>@{u}
) fait référence à la branche spécifiée par la branche branchname est configuré pour construire au-dessus de. Un nom de branche manquant par défaut à l'actuel.
Par conséquent, pour trouver l’amont de la branche master
, vous feriez:
git rev-parse --abbrev-ref master@{upstream}
# => Origin/master
Pour imprimer les informations pour chaque branche, 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
# ...
C'est plus propre que d'analyser manuellement les références et les configurations.
Une alternative à la réponse de kubi est de consulter le fichier .git/config
qui montre la configuration du référentiel local:
cat .git/config
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 en double.
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
montrera une ligne pour chaque branche locale. Une branche de suivi ressemblera à:
master <- Origin/master
Un non suivi va ressembler à:
test <-
Pour la branche actuelle, vous pouvez également dire git checkout
(sans branche). Il s'agit d'un no-op avec des effets secondaires pour afficher les informations de suivi, le cas échéant, 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 " $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
Basé sur 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 seulement local avec piste configurée.
Ecrivez-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 branche distante suivie.
Vous devrez remplacer $ current_branch par le nom de votre branche actuelle. Vous pouvez obtenir cela dynamiquement avec git rev-parse --abbrev-ref HEAD
Le mini-script suivant combine ces éléments. Collez-le dans un fichier nommé git-tracking
, rendez-le exécutable et assurez-vous qu'il se trouve 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 de celui de votre branche locale (bien qu'il ne le soit généralement pas). Par exemple:
$git tracking
xxx_xls_xslx_thing -> Origin/totally_bogus
comme vous pouvez le voir dans le code, la clé est d'extraire les données de la configuration de git. J'utilise simplement 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"
En voici un net et simple. Peut vérifier git remote -v
, qui vous montre toute l'origine et en amont de la branche actuelle.