2012-04-09 55 views
21

如何获取某些远程起源分支的所有名称?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 

重要的是,它应该没有grepsedtail甚至ghc -e包装来完成,只有真正git力量,因为他们unsafeness和变异。

回答

30

重要的是,它应该没有grepsedtail甚至ghc -e包装来完成,只有真正的git的力量,因为他们unsafeness和变异。

即只对git的瓷器命令真(参见“What does the term porcelain mean in Git?”)

使用管道命令ls-remote,然后你就可以过滤它的输出。

LS-远程无参数仍然会列出远程端:

[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,但管道命令的输出应该是稳定的eno呃被解析)

+0

看起来不错。感谢您的详尽答复。 – 2012-04-09 17:33:40

+3

我也可以回答这个问题,但是“no sed”规则发生了什么?大声笑,无论 – KurzedMetal 2012-04-09 19:10:14

+3

@KurzedMetal是真实的,但我仔细证明使用'sed'只使用管道命令,而不是像'git branch'这样的瓷器命令。请参阅http://stackoverflow.com/questions/2978947/how-to-list-all-the-log-for-current-project-in-git/2979124#2979124或http://stackoverflow.com/questions/2976665/git-changelog -day-by-day/2976776#2976776 – VonC 2012-04-09 21:06:31

2

现有的答案都使用明确不想在问题(sed)中的东西,并且是一个远程命令。

我发现这一点,避免了这两个问题,只使用本地的git命令和管道:

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

更新:不是最佳下去,但保持它,如果有人知道如何改进它。它列出了包括/遥控器/原点前缀的完整遥控器,前提是您没有本地分支,但只有本地名称(如果有)。另外,如果有多个指向相同的SHA1,它似乎会跳过一些参考。

3

的另一种方法,一些研究同样的问题后,就是:

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

这将给当地的裁判的排序列表在该点指定的远程上次牵强。

您可以调整它们的标签等。