如何使用除master之外的默认分支名称创建git存储库?

时间:2017-03-18 07:03:54

标签: git version-control

git-book中,它说

  

“origin”并不特别

     

就像分支名称“master”在Git中没有任何特殊含义一样,“origin”也没有。 虽然“master”是运行git init时启动分支的默认名称,这是它被广泛使用的唯一原因,但“origin”是运行git clone时远程的默认名称。如果你改为运行git clone -o booyah,那么你将把booyah / master作为你的默认远程分支。

这意味着,我们可以将默认分支名称用作 main main-branch 或类似的东西。我在man git-init中没有看到任何使用不同默认分支名称初始化repo的选项。

Github显示如何在其设置页面中设置默认分支名称。但我不是在谈论如何在任何特定的 git托管网站中设置它。我只是严格询问git,而不是针对任何特定的 git托管网站

有办法吗?

4 个答案:

答案 0 :(得分:24)

如何使用默认分支名称而不是“ master”创建Git存储库?

您将使用Git 2.28(2020年第3季度):现有存储库中主要分支的名称以及新创建存储库中第一个分支所使用的默认名称是可配置的,以便我们最终可以自行退出硬编码的“ master”。

还有Aug. 2020 from GitHub的提醒:

在2020年10月1日,如果您尚未更改用户,组织或企业的新存储库的默认分支,它将自动从master更改为main < / strong>。
您可以随时选择退出此更改:

  • 对于用户,在https://github.com/settings/repositories页上
  • 对于组织所有者,请在https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaults页上
  • 对于企业管理员,在https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privileges页上

此更改是GitHub为支持要重命名其默认分支的项目和维护人员而进行的众多更改之一。
要了解有关我们正在进行的更改的更多信息,请参见github/renaming

但回到Git本身:(2020年第三季度2.28) 请参见commit 508fd8eĐoàn Trần Công Danh (sgn)(2020年6月29日)。
请参阅commit 0068f21commit a471214commit 0cc1b47commit 32ba12dcommit 6069ecccommit f0a96e8commit 4d04658(2020年6月24日)和{ {3}}(2020年6月23日)作者:commit 489947c
请参见Johannes Schindelin (dscho)commit 8747ebb(2020年6月24日)。
(由Don Goodman-Wilson (DEGoodmanWilson)Junio C Hamano -- gitster --中合并,2020年7月6日)

commit 11cbda2:允许为新存储库指定初始分支名称

签名人:Johannes Schindelin

越来越多的项目和公司希望更改其存储库的主要分支名称(有关背景,请参见init)。

要更改新存储库的分支名称,当前唯一自动执行的方法是复制Git的所有模板目录,然后将所需的默认分支名称硬编码到.git/HEAD文件中,然后进行配置init.templateDir指向那些复制的模板文件。

为减少此过程的麻烦,让我们介绍一个新选项:--initial-branch=<branch-name>

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

并且:

Mislav Marohnić's tweet:允许通过配置为初始分支名称设置默认值

帮助人:约翰尼斯·辛德林
帮助人:德里克·斯托利
签名人:Don Goodman-Wilson

我们刚刚引入了命令行选项--initial-branch=<branch-name>,以允许使用与硬编码分支不同的初始分支来初始化新存储库。

要允许用户更永久地覆盖初始分支名称(即,不必为每个git init调用手动指定名称),我们来介绍init.defaultBranch的配置设置。

注意:关于合并提交消息的init已在Git 2.29中恢复,请参见“ commit 489947c”。
init.defaultBranch设置保持不变。


这会影响子模块:

how can I customize git's merge commit message?:由于缺少遥控器而回退到遥控器的HEAD。

帮助者:Philippe Blain
签名人:Johannes Schindelin

未配置remote.<name>.branch时,submodule当前回退到使用分支名称master
但是,更好的主意是使用远程HEAD:在运行合理最新Git版本的所有Git服务器上,symref HEAD指向main分支。

注意:t7419证明存在可能个用例,它们可以期望 git submodule update将子模块更新到远程master分支,即使远程HEAD指向另一个分支。
可以说,此修补程序使行为更直观,但极有可能在晦涩的设置中导致回归。

即使这样,也可以在没有更长过渡期的情况下解决此问题:

  • git submodule update --remote命令并不是很常见。
  • 运行此命令时,当前Git的行为完全令人困惑,除非远程存储库的当前分支为 master(在这种情况下,建议的行为与旧行为匹配)。
  • 如果用户由于更改的行为而遇到退步,则此修复实际上是微不足道的:将submodule.<name>.branch设置为master将恢复旧的行为。

请注意,在Git 2.29(2020年第四季度)中,contrib/中的测试已根据最近对fmt-merge-msg的更改进行了调整。

请参见git submodule update --remotecommit b87528c(2020年8月3日)。
(由Emily Shaffer (nasamuffin)Junio C Hamano -- gitster --中合并,2020年8月10日)

commit 83b8250subtree:调整测试以更改fmt-merge-msg

签名人:艾米莉·谢弗

这将还原Revert "contrib

commit 508fd8e8baf3e18ee40b2cf0b8899188a8506d07fmt-merge-msg:再次允许合并目标)中,我们得到了与“ master”进行合并的行为,默认情况下,不包含“ {{1 }}“合并消息的末尾。不再需要此测试修复程序。

也:

使用Git 2.29(2020年第四季度),更新测试以从其中删除单词“ into 'master'”。

请在6e6029a8前参阅commit f33f2d3commit b6211b8(2020年9月26日)和commit 432f5e6commit 5a0c32bcommit 659288c(2020年9月21日) 。
(由Johannes Schindelin (dscho)Junio C Hamano -- gitster --中合并,2020年10月5日)

commit 58138d3:避免更改master分支名称

签名人:Johannes Schindelin

master一词有着悠久的历史,不断提醒着种族不公。 Git项目不希望这种情况永久存在,并且已经开始避免这种情况。

测试套件对默认分支以外的分支使用此名称的变体。除了t3200,我们在上一提交中刚刚解决了这一问题,这些实例可以自动重命名,因为它们不需要在测试脚本之外进行任何更改,所以让我们这样做。

由于触摸的分支与默认分支几乎没有关系(如果有的话),我们选择使用完全独立的命名方案:master(不能为topic_<number>,因为t5515使用topic-<number>机械设备,该机械设备在内部使用shell变量,其名称不能包含破折号。

此技巧是由以下(GNU)sed调用执行的:

test_oid

而且,仍然使用Git 2.29:

请参见testscommit 538228ecommit a15ad5d(2020年10月8日)。
(由Johannes Schindelin (dscho)Junio C Hamano -- gitster --中合并,2020年10月8日)

commit 62564ba:避免使用$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh 作为引用名称

签名人:Johannes Schindelin

为准备将main的备用版本更改为init.defaultBranch的补丁系列,在此测试脚本中,请勿使用main作为参考名称。

否则,想要捕获这些引用的t1415 git for-each-ref ... | grep main也会意外地捕获main

由于所涉及的ref是本地的工作树(即每个工作树都有自己的ref,就像refs/heads/main一样),并且由于测试用例已经使用了名为“ HEAD”的辅助工作树,因此,对于这些引用,请使用名称“ second”。

与此同时,调整当它们表示“工作树”时涉及“回购”的测试标题。

答案 1 :(得分:16)

Git 2.28 (于2020年7月27日发布)以来,引入了一个新的配置选项$ kubectl -n my-namespace --as="system:serviceaccount:my-account:default" auth can-i deletecollection pipelines.tekton.de yes ,以取代硬编码的术语*/ // include the library code: #include <LiquidCrystal.h> // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // initialize the serial communications: Serial.begin(9600); } void loop() { // when characters arrive over the serial port... if (Serial.available()) { // wait a bit for the entire message to arrive delay(100); // clear the screen lcd.clear(); // read all the available characters while (Serial.available() > 0) { // display each character to the LCD lcd.write(Serial.read()); } } }

默认设置为 #include<iostream> #include<vector> using namespace std; void sort(vector <int> &v, int i, int j, int end2) { vector <int> v1; int start1=i, start2=j, end1=j; while((start1<end1)||(start2<end2)) { if((start1<end1)&&(start2<end2)) { if(v[start1]<v[start2]) { v1.push_back(v[start1]); start1++; } else if (v[start1]==v[start2]) { v1.push_back(v[start1]); start1++; start2++; } else { v1.push_back(v[start2]); start2++; } } else if((start1<end1)&&(start2>=end2)) { v1.push_back(v[start1]); start1++; } else if((start1>=end1)&&(start2<end2)) { v1.push_back(v[start2]); start2++; } } int s=i; while(s<end2) { v[i]=v1[i]; i++; } } void mergeSort(vector <int> &v, int s) { int low, end2, high; for(int k=2;k<=s;k=k*2) { for(int i=0;i+k-1<s;i=i+k) { low=i; high=i+k; end2=i+2*k; sort(v, low, high, end2); } } } int main() { vector <int> v; int n; cout<<"Enter the no. of elements you want to sort\n"; cin>>n; int d; cout<<"Enter the values\n"; for(int i=0;i<n;i++) { cin>>d; v.push_back(d); } int s= v.size(); mergeSort(v, s); for(int i=0;i<n;i++) { cout<<v[i]<<"\t"; } cout<<endl; }

用户可以使用以下命令覆盖配置变量的默认值:

init.defaultBranch

阅读git doc章节以获取更多详细信息Introducing init.defaultBranch

答案 2 :(得分:13)

正如您所注意到的,分支名称git init没有参数,因此必须执行两个命令。

git init
git checkout -b trunk

这将创建一个新的存储库,其中trunk作为当前分支而不是master。分支master实际上并不存在 - 分支在至少有一次提交之前不会被创建。在创建分支之前,分支仅存在于.git/HEAD中,这解释了当您切换到mastertrunk分支将消失的原因。

如果您已提交,则可以改为运行git branch -m

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

此分支一旦创建,就会将分支从master重命名为trunk

这似乎有点笨拙,因为机制不同,取决于存储库是否为空,但它是否有效。

答案 3 :(得分:5)

您可以间接地将git init配置为使用不同的默认分支:当前分支由HEAD定义,它只是一个文本文件,告诉git哪个ref是当前的。< / p>

使用init.templateDir,您可以要求git init使用另一个:

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

并在~/.config/git/template/HEAD中添加一行(+换行符):ref: refs/heads/main(默认为分支main)。

创建存储库时,templateDir的全部内容将复制到.git目录;默认值(此处为/usr/share/git-core/templates)包含一些示例挂钩和其他文件,但您可以使用新模板目录来设置默认挂钩,例如。

$ tree /usr/share/git-core/templates 
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files