Подтвердить что ты не робот

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 из-за их неясности и вариации.

4b9b3361

Ответ 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.