41

如何获得一些远程起源分支的所有名称?

我从--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, sedtail甚至ghc -e包装器的情况下完成,只有真正git的力量,因为它们的不安全性和变化。

4

3 回答 3

47

重要的是它应该在没有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 年第三季度),其中记录了一个示例

git branch -r -l '<remote>/<pattern>'
git for-each-ref 'refs/remotes/<remote>/<pattern>'
于 2012-04-09T16:43:53.407 回答
9

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

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

这将为您最后一次获取的命名远程提供本地参考的排序列表。

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

于 2016-12-25T22:11:13.207 回答
3

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

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

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

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

于 2016-07-21T12:37:42.830 回答