git - 如何获得默认分支?

时间:2015-02-23 03:09:00

标签: git

我的团队在使用dev和master作为多个repos的默认分支之间交替使用,我想编写一个脚本,在输入目录时检查默认分支。

当在其中一些回购中打开拉取请求时,它们默认为'dev'或'master'作为合并目标。

我了解如何设置此信息但不检索它: https://help.github.com/articles/setting-the-default-branch/

是否有可用于确定远程存储库的默认分支的git命令?

13 个答案:

答案 0 :(得分:21)

在Github克隆的repo中使用git 2.9.4(但可能在其他版本中有效)进行测试:

$ git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
master

答案 1 :(得分:15)

我发现了一种检测默认分支的方法,如果它不是主分支。

git remote show [your_remote] | grep "HEAD branch" | cut -d ":" -f 2

我用gitlab的多个repo测试了它,它工作正常。

答案 2 :(得分:6)

这个问题有点老了,但是如果有人最近遇到这个问题...

git remote show <remote_name> | awk '/HEAD branch/ {print $NF}'

这还将仅显示分支名称,不包括任何空格或其他废话。

我喜欢使用几个git别名来保存它(我有很多有用的别名,例如:)

upstream-name = !git remote | egrep -o '(upstream|origin)' | tail -1
head-branch = !git remote show $(git upstream-name) | awk '/HEAD branch/ {print $NF}'

我几乎100%的时间都使用“上游”和“原点”作为我的遥控器(当我使用Fork & Pull工作流时经常使用“上游” ...)。您的用例可能不需要upstream-name别名,我觉得它很有用。

答案 3 :(得分:5)

git rev-parse --abbrev-ref origin/HEAD将打印origin/<default-branch-name>git symbolic-ref答案在做同样的事情,但是需要更长的参数。

如果origin存储库更改了其默认分支名称,则git remote set-head origin -a将检索新的默认分支名称。

答案 4 :(得分:4)

到目前为止,似乎没有一个答案不需要克隆

这需要git 2.8.0或更高版本

$ git ls-remote --symref git@github.com:pre-commit/pre-commit.github.io HEAD
ref: refs/heads/real_master HEAD
e100a6a3c72b4e54f0d176f791dfd2dbd7eb5fa7    HEAD

答案 5 :(得分:3)

  

是否有可用于确定远程存储库的默认分支的git命令?

不,似乎没有:

git ls-remote -v https://github.com/<user>/<repo>

那会列出所有分支,但不会列出HEAD(指定默认分支的symref)

同样,GitHub Reference API可以列出头部,但也不包括HEAD。

答案 6 :(得分:3)

git symbolic-ref 有一个 - short 选项。所以我的首选命令是:

$ git symbolic-ref --short HEAD
master

答案 7 :(得分:3)

如果喜欢这个问题,您正在尝试获得 GitHub 默认分支——而不是其他一些 git 服务器:

您可以使用 /repos GitHub API 获取默认分支。这是响应的 default_branch 字段:

$ curl -s https://api.github.com/repos/darthwalsh/bootstrappingCIL | \
      jq --raw-output .default_branch
master

答案 8 :(得分:3)

我只是想要一个 shell 脚本来知道分支是“master”还是“main”。

为此目的,这似乎已经足够了:

[ -f "$(git rev-parse --show-toplevel)/.git/refs/heads/master" ] && echo master || echo main

如果你知道它总是从repo的根目录调用,可以简化为

[ -f .git/refs/heads/master ] && echo master || echo main

我在我的 Git 别名中使用它,如下所示:https://github.com/henrik/dotfiles/commit/6815bd95770afab2936fb6202b1ee5e82cb9662b

答案 9 :(得分:2)

这适用于Git 2.1.10,使用从GitHub克隆的存储库:

git branch -r --points-at refs/remotes/origin/HEAD

这种方法的一个主要问题是它列出了指向HEAD的每个远程分支;但是,输出包括一个提示:

  origin/HEAD -> origin/master
  origin/master
  origin/test123

因此,您可以使用grep或类似内容对输出进行后处理,以找到带箭头的输出:

git branch -r --points-at refs/remotes/origin/HEAD | grep '\->' | cut -d' ' -f5 | cut -d/ -f2

答案 10 :(得分:2)

以下命令将列出 HEAD 分支,无论您如何命名遥控器:

git branch --remotes --list '*/HEAD'

从中你可以像这样提取默认分支:

git branch -rl '*/HEAD' | rev | cut -d/ -f1 | rev

(使用 git branch 参数的短变体)。

答案 11 :(得分:1)

所有其他答案都做了太多假设,这是对我有用的唯一方法。无论您当前在哪个分支上,这都有效,不假设 origin/HEAD ref 存在于本地,并且将始终反映当前的默认分支,即使它已更改。

唯一的缺点是它改变了本地 origin/HEAD 引用,但这通常不会成为问题。

允许 git 设置您的 origin/HEAD,确定要自动使用的分支:

$ git remote set-head origin --auto
origin/HEAD set to main

然后,获取一个包含默认分支名称的字符串:

$ git rev-parse --abbrev-ref origin/HEAD
origin/main

或者,对于单行解决方案:

$ git remote set-head origin --auto >/dev/null 2>&1 && git rev-parse --abbrev-ref origin/HEAD
origin/main

答案 12 :(得分:0)

看起来像是一个解决方案,但这似乎有效:

$ cat .git/refs/remotes/origin/HEAD 
ref: refs/remotes/origin/master