Je voudrais savoir s'il existe un moyen de savoir quelle branche locale suit quelle branche distante dans Git.
J'utilise un serveur distant nommé "Origin".
En utilisant l'exemple de ma copie de Puppet extraite du référentiel Git en amont sur 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)
Ensuite, si je devais exécuter ce qui suit:
$ 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'
Et enfin relancez le git remote show Origin
commande à nouveau, je verrai ensuite ce qui suit vers le bas:
Local branches configured for 'git pull':
local_2.6 merges with remote 2.6.x
master merges with remote master
Pour toutes les branches:
git branch -avv
Pour les succursales locales uniquement:
git branch -lvv
Pour les succursales distantes uniquement:
git branch -rvv
vous montre toutes les branches ainsi que le nom de la branche en amont.
Jeremy Bouse illustre comment git remote show
Affiche les informations de suivi . Cela devrait être suffisant si vous ne voulez que les informations pour la consommation humaine.
Si vous prévoyez d'utiliser les informations dans un contexte automatisé (par exemple un script), vous devez utiliser le niveau inférieur ("plomberie") git for-each-ref
à la place.
% 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
Le git for-each-ref
A appris le jeton %(upstream)
dans Git 1.6. . Avec les versions antérieures de Git, vous devrez extraire les informations de suivi avec git config branch.<name>.remote
Et git config branch.<name>.merge
(En utilisant probablement git for-each-ref
Pour créer les commandes pour chaque nom de branche locale).
Pour une branche particulière, vous pouvez utiliser git rev-parse
avec le @{u}
ou @{upstream}
suffixe sur le nom de la branche, par exemple:
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master
... ou pour la forme abrégée, ajoutez --abbrev-ref
$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master
Vous pouvez généralement utiliser le branch@{upstream}
syntaxe partout où une validation est attendue.
J'utilise le script Shell suivant (nommé git-tracks
) pour afficher la branche distante qui est suivie par la branche actuelle:
#!/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:?}"
Cela pourrait également utiliser le git for-each-ref
, mais j'ai trouvé l'accès direct un peu plus simple que le filtrage de la sortie pour la branche courante.
.git/config
le fichier fournira également les informations de la branche de suivi comme
[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/*
git branch -vv
montre exactement ce que vous demandez. Il montre les branches locales ainsi que la branche distante correspondante qu'elles suivent.
Ajoutez ces runes au [alias]
section de votre fichier .gitconfig:
show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|Perl -pe "s/[[:alnum:]]+[[:space:]]//"'
J'avais besoin de trouver la branche distante correspondante (le cas échéant) pour chaque branche locale dans une boucle qui agissait sur une liste des branches locales. J'ai fini par utiliser ce qui suit:
git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"
Cela ne produira rien (une chaîne vide) pour les branches locales qui n'ont pas de branche distante correspondante ("someremote/somebranch").