我的团队在使用dev和master作为多个repos的默认分支之间交替使用,我想编写一个脚本,在输入目录时检查默认分支。
当在其中一些回购中打开拉取请求时,它们默认为'dev'或'master'作为合并目标。
我了解如何设置此信息但不检索它: https://help.github.com/articles/setting-the-default-branch/
是否有可用于确定远程存储库的默认分支的git命令?
答案 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