Git список имен веток конкретного удаленного
Как можно получить все имена ветвей удаленного происхождения?
Я начал с опций --remote --list
, но получил избыточное сообщение origin/HEAD -> origin/master
и ветки из другого источника.
$> 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
Филиалы определенного происхождения могут быть сопоставлены с опцией <pattern>
, но избыточное сообщение все еще существует. На самом деле этот шаблон не совсем правильный, потому что какое-то имя происхождения может быть подстрокой другого имени происхождения или даже некоторой ветки.
$> git branch --remote --list origin1*
origin1/HEAD -> origin/master
origin1/develop
origin1/feature/1
origin1/feature/2
origin1/feature/3
origin1/master
Я ищу список имен ветвей origin1
, любой из которых я мог бы использовать для команды git checkout
. Что-то вроде этого:
develop
feature/1
feature/2
feature/3
master
Важно, чтобы это было сделано без оберток grep
, sed
, tail
или даже ghc -e
, только с истинным значением git
из-за их неясности и вариации.
Ответы
Ответ 1
Важно, чтобы это было сделано без ghc -e
оболочек grep
, sed
, tail
или даже ghc -e
, только с настоящей силой мерзавца из-за их небезопасности и изменчивости.
Это верно только для команд git фарфор (см. " Что означает термин фарфор в Git? ")
Используйте сантехническую команду ls-remote, и тогда вы сможете отфильтровать ее вывод.
ls-remote без параметра будет по-прежнему перечислять удаленный заголовок:
[email protected]:~/ce/ce6/.git$ git ls-remote origin
8598d26b4a4bbe416f46087815734d49ba428523 HEAD
8598d26b4a4bbe416f46087815734d49ba428523 refs/heads/master
38325f657380ddef07fa32063c44d7d6c601c012 refs/heads/test_trap
Но если вы спросите только главы сказал, что пульт
[email protected]:~/ce/ce6/.git$ git ls-remote --heads origin
8598d26b4a4bbe416f46087815734d49ba428523 refs/heads/master
38325f657380ddef07fa32063c44d7d6c601c012 refs/heads/test_trap
Окончательный ответ:
[email protected]:~/ce/ce6/.git$ git ls-remote --heads origin | sed 's?.*refs/heads/??'
master
test_trap
(Да, он использует sed
, но вывод команды сантехника должен быть достаточно стабильным для анализа)
Смотрите также Git 2.23 (Q3 2019), в котором приведен пример:
git branch -r -l '<remote>/<pattern>'
git for-each-ref 'refs/remotes/<remote>/<pattern>'
Ответ 2
Альтернативный метод после некоторого исследования той же проблемы:
git for-each-ref --format='%(refname:strip=2)' refs/remotes/<remote_name>
Это даст отсортированный список локальных ссылок для именованного пульта в том месте, в котором вы были последними.
Вы можете настроить это для своих тегов и т.д.
Ответ 3
Существующий ответ использует то, что явно не требуется в вопросе (sed) и является удаленной командой.
Я нашел это, что позволяет избежать этих проблем, использует только локальные команды git и pipe:
git rev-parse --remotes=origin | git name-rev --name-only --stdin
Обновление: не очень оптимально, но сохраняйте его, если кто-то знает, как его улучшить. В нем перечислены полный удаленный доступ, включая префикс /remotes/origin, если у вас нет локальной ветки, но только локальное имя, если у вас есть. Кроме того, он, кажется, пропускает некоторые ссылки, если несколько указывают на один и тот же SHA1.