Git liste des noms de branche de la télécommande spécifique

Comment obtenir tous les noms de quelques branches d'origine distante?

j'ai commencé à partir de --remote --list options, mais est devenu redondant origin/HEAD -> origin/master message et branches de l'autre origine.

$> git branch --remote --list
  origin/HEAD -> origin/master
  origin1/develop
  origin1/feature/1
  origin1/feature/2
  origin1/feature/3
  origin1/master
  origin2/develop
  origin2/feature/1
  origin2/feature/2
  origin2/master

Branches d'origine spécifique pourrait être apparié avec <pattern> option, mais le message redondant est toujours là. En fait ce modèle n'est pas vraiment correct, parce que le nom d'une origine pourrait être un substrat d'une autre origine nom, ou même certains de la branche.

$> git branch --remote --list origin1*
  origin1/HEAD -> origin/master
  origin1/develop
  origin1/feature/1
  origin1/feature/2
  origin1/feature/3
  origin1/master

ce que je cherche est une liste de noms de branches de origin1 , n'importe lequel d'entre eux je pourrais utiliser pour la commande git checkout . Quelque chose comme ça:

develop
feature/1
feature/2
feature/3
master

il est important que ce soit fait sans grep , sed , tail ou même ghc -e wrappers, seulement avec la vraie git puissance, en raison de leur instabilité et la variation.

24
demandé sur ДМИТРИЙ МАЛИКОВ 2012-04-09 19:02:24

3 réponses

il est important que ce soit fait sans grep , sed , tail ou même ghc -e wrappers, seulement avec une vraie puissance de gitan, en raison de leur instabilité et de leur variation.

qui est seulement vrai pour les commandes de porcelaine git (voir " que signifie le terme porcelaine dans Git? ")

utiliser la commande de plomberie ls-remote , et ensuite vous pourrez filtrer sa sortie.

ls-télécommande sans paramètre serait encore de la liste de la distance de la TÊTE:

git@vonc-VirtualBox:~/ce/ce6/.git$ git ls-remote origin
8598d26b4a4bbe416f46087815734d49ba428523    HEAD
8598d26b4a4bbe416f46087815734d49ba428523    refs/heads/master
38325f657380ddef07fa32063c44d7d6c601c012    refs/heads/test_trap

mais si vous demandez seulement les têtes de ladite télécommande:

git@vonc-VirtualBox:~/ce/ce6/.git$ git ls-remote --heads origin
8598d26b4a4bbe416f46087815734d49ba428523    refs/heads/master
38325f657380ddef07fa32063c44d7d6c601c012    refs/heads/test_trap

réponse finale:

git@vonc-VirtualBox:~/ce/ce6/.git$ git ls-remote --heads origin  | sed 's?.*refs/heads/??'
master
test_trap

(Oui, il utilise sed , mais la sortie d'une commande de plomberie est supposée être assez stable pour être analysée)

33
répondu VonC 2017-05-23 12:25:52

Une autre méthode, après quelques recherches sur le même problème, est:

git for-each-ref --format='%(refname:strip=2)' refs/remotes/<remote_name>

Cela donnera une liste triée de vos références locales pour la télécommande nommée au point que vous avez récupéré la dernière fois.

vous pouvez ajuster ceci pour leurs étiquettes, etc.

3
répondu Philip Oakley 2016-12-25 22:11:13

la réponse existante utilise à la fois quelque chose explicitement non voulu dans la question (sed) et est une commande à distance.

j'ai trouvé ceci qui évite à la fois ces deux problèmes, utilise seulement des commandes git locales et un tuyau:

git rev-parse --remotes=origin | git name-rev --name-only --stdin

Update : pas vraiment optimal non plus, mais le garder si quelqu'un sait comment l'améliorer. Il affiche la télécommande complète avec le préfixe /remotes / origin si vous n'avez pas de local branche, mais seulement le nom local si vous en avez. En outre, il semble sauter quelques références s'il ya plusieurs pointant vers le même SHA1.

2
répondu Zitrax 2016-07-21 13:24:14