我的团队交替使用dev和master作为几个repos的默认分支,我想编写一个脚本,在输入目录时检查默认分支.
当在某些repos中打开pull请求时,它们默认为'dev'或'master'作为合并目标.
我了解如何设置此信息但不检索它:https: //help.github.com/articles/setting-the-default-branch/
是否有可用于确定远程存储库的默认分支的git命令?
dan*_*kza 26
在Github克隆的repo中使用git 2.9.4(但可能在其他版本中工作)进行测试:
$ git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
master
Rad*_*472 20
我找到了一种方法来检测默认分支,如果它不是主分支.
git remote show [your_remote] | grep "HEAD branch" | cut -d ":" -f 2
我用gitlab的多个repo测试了它,它工作得很好.
Joe*_*nux 19
这个问题有点老了,但如果有人最近遇到这个问题......
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别名,我只是觉得它很有用。
Jef*_*kin 18
git rev-parse --abbrev-ref origin/HEAD将打印origin/<default-branch-name>。的git symbolic-ref回答也在做着同样的事情,但需要一个较长的说法。
如果origin存储库更改其默认分支名称,git remote set-head origin -a则将检索新的默认分支名称。
Hen*_*nry 17
您需要refs/remotes/origin/HEAD并且仅在克隆时设置。否则你需要自己设置
git remote set-head origin -a
无论您如何命名遥控器,以下命令都会列出 HEAD 分支:
git branch --remotes --list '*/HEAD'
您可以从中提取默认分支,如下所示:
git branch -rl '*/HEAD' | rev | cut -d/ -f1 | rev
(使用git branch参数的简短变体)。
如果您的 shell 没有该rev命令,您可以使用awk:
git branch -rl '*/HEAD' | awk -F/ '{print $NF}'
Amo*_*ory 15
正如其他回答者所指出的,默认分支的概念是 GitHub 的事情,对于 Git 来说并没有真正的意义(从崇高的意义上来说)(这里有一个相当不错的(如果没有得到充分重视)评论对此进行了一些介绍:https ://stackoverflow.com/a/65710958/2521092)但在实践中,我们都知道这意味着什么。
自从最初提出这个问题以来,Git 2.28 添加了init.defaultBranch,允许与 不同的初始分支master,并且很多项目现在都在使用main. 那挺好的。这里的大多数答案都依赖于检查遥控器,但这依赖于实际上存在一个遥控器,并且这些遥控器存在可靠且一致的命名方案。这些可能(越来越?)合理的假设,但这不是保证,而且我发现这里的任何主要答案都不会很好地失败。
此外,我的主要用例是使用各种 git 别名的默认分支的名称(例如lm = log main..HEAD)。我想使用相同的别名,而无需考虑太多,无论使用外部存储库还是不使用远程的master本地使用。mainGit 及其配置无法真正“存储”信息,因此无法提前设置当前存储库的主分支是什么。因此,任何想要显示主分支和 HEAD 之间提交的别名都不能假设git log master..HEAD或git log main..HEAD工作。
因此,我default-branch在 Git 中定义了一个别名,它可以找出默认分支,然后将其提供给其他别名。这是一个痛苦,因为一个简单的东西lm = log main..HEAD必须变成,lm = "!git log $(git default-branch)..HEAD"但我们在这里:
default-branch = "!git branch --sort=-refname | grep -o -m1 '\\b\\(main\\|master\\|dev\\)\\b'"
这只是获取分支名称,然后找到定义列表中的第一个分支。如果有main,则使用它;如果没有并且有一个master,请使用它。我还有dev一些人使用的第三选项。
这有点类似于 @henrik-n 在/sf/answers/4663565441/中所做的事情,但我是在 Git 本身而不是 shell 中完成的,而且我认为它有更多的可选性。
小智 14
这可以通过 gh cli 工具获得(已测试 v2.0.0)
gh repo view --json defaultBranchRef --jq .defaultBranchRef.name
小智 8
所有其他答案都做了太多假设,这是对我有用的唯一方法。无论您当前位于哪个分支,这都有效,不假设origin/HEAD引用存在于本地,并且始终反映当前的默认分支,即使它已被更改。
唯一的缺点是它改变了本地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
到目前为止,似乎没有一个不需要克隆的答案
这需要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
我只是想要一个 shell 脚本来知道分支是“master”还是“main”。
出于这个目的,这似乎足够好了:
[ -f "$(git rev-parse --show-toplevel)/.git/refs/heads/master" ] && echo master || echo main
如果您知道它将始终从存储库的根目录调用,则可以将其简化为
[ -f .git/refs/heads/master ] && echo master || echo main
我在我的 Git 别名中使用它,如下所示:https://github.com/henrik/dotfiles/commit/6815bd95770afab2936fb6202b1ee5e82cb9662b
是否有 git 命令可用于确定远程存储库的默认分支?
这列出了默认的本地存储库分支:
git rev-parse --abbrev-ref origin/HEAD
gh api /repos/{owner}/{repo} --jq '.default_branch'
小智 5
git symbolic-ref有一个--short选项。所以我的首选命令是:
$ git symbolic-ref --short HEAD
master
如果像这个问题一样,您正在尝试获取GitHub默认分支,而不是其他 git 服务器:
/repos您可以使用GitHub API获取默认分支。这是default_branch响应的字段:
$ curl -s https://api.github.com/repos/darthwalsh/bootstrappingCIL | \
      jq --raw-output .default_branch
master
| 归档时间: | 
 | 
| 查看次数: | 12007 次 | 
| 最近记录: |