如何获取某些远程源分支的所有名称?
我从
--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
功率,因为它们不安全且变化多端。
重要的是,应该在没有
、grep
、sed
甚至tail
包装器的情况下完成此操作,而只能使用真正的 git 功能,因为它们不安全且变化多端。ghc -e
这只适用于 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>'
对同一问题进行一些研究后,另一种方法是:
git for-each-ref --format='%(refname:strip=2)' refs/remotes/<remote_name>
这将给出您上次获取时指定远程的本地引用的排序列表。
您可以针对他们的标签等进行调整。
现有答案既使用了问题中明确不需要的东西(sed),又是一个远程命令。
我发现这可以避免这两个问题,仅使用本地 git 命令和管道:
git rev-parse --remotes=origin | git name-rev --name-only --stdin
更新:也不是真正最佳,但如果有人知道如何改进它,请保留它。如果您没有本地分支,它会列出完整的远程,包括 /remotes/origin 前缀,但如果有本地分支,则仅列出本地名称。此外,如果有多个指向相同的 SHA1,它似乎会跳过一些参考。
实际上这种模式并不正确,因为某些源的名称可能是另一个源名称的子字符串,甚至是某个分支。
这部分不正确,
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}'