特定远程分支名称的 Git 列表

问题描述 投票:0回答:4

如何获取某些远程源分支的所有名称?

我从

--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
功率,因为它们不安全且变化多端。

git git-branch
4个回答
51
投票

重要的是,应该在没有

grep
sed
tail
甚至
ghc -e
包装器的情况下完成此操作,而只能使用真正的 git 功能,因为它们不安全且变化多端。

这只适用于 git瓷器命令(请参阅“术语瓷器在Git中意味着什么?”)

使用管道命令ls-remote,然后您将能够过滤其输出。

不带参数的 ls-remote 仍会列出远程 HEAD:

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

但是如果您只要求所述遥控器的头部:

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

最终答案:

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

(是的,它使用

sed
,但是管道命令的输出应该足够稳定以进行解析)


另请参阅 Git 2.23(2019 年第 3 季度),其中记录了一个示例

git branch -r -l '<remote>/<pattern>'
git for-each-ref 'refs/remotes/<remote>/<pattern>'

10
投票

对同一问题进行一些研究后,另一种方法是:

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

这将给出您上次获取时指定远程的本地引用的排序列表。

您可以针对他们的标签等进行调整。


3
投票

现有答案既使用了问题中明确不需要的东西(sed),又是一个远程命令。

我发现这可以避免这两个问题,仅使用本地 git 命令和管道:

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

更新:也不是真正最佳,但如果有人知道如何改进它,请保留它。如果您没有本地分支,它会列出完整的远程,包括 /remotes/origin 前缀,但如果有本地分支,则仅列出本地名称。此外,如果有多个指向相同的 SHA1,它似乎会跳过一些参考。


0
投票

实际上这种模式并不正确,因为某些源的名称可能是另一个源名称的子字符串,甚至是某个分支。

这部分不正确,

git branch
中的匹配似乎需要完全匹配,因此
origin*
不会匹配
my_origin/my_branch_name
。为了避免与
origin_two/my_branch_name
匹配,您可以在模式中添加尾部斜杠,这样您就可以与
origin1/*
匹配。

正如其他回答者所说,我认为进一步解析输出没有任何问题 - 所以这是我想出的最终解决方案:使用

awk
通过指定
/
作为分隔符来仅获取分支名称,并且打印第二个字段。

git branch --remote --list 'remote_name/*' | awk -F '/' '{print $2}'
© www.soinside.com 2019 - 2024. All rights reserved.