没有主分支创建的Git存储库

Aye*_*let 19 git repository git-branch

我想为新项目(在VM上)创建一个新的共享git存储库.

我跑git --bare init/.../git/new_proj.git,但.../git/new_proj.git/refs/heads目录中没有创建主分支.我也运行sudo chmod 777 -R了我的目录,但它没有帮助,并且在init命令后仍然没有创建master .

编辑: 我甚至尝试使用git init(没有裸标志),但仍然没有创建主分支.

谷歌在这件事上帮助不大......

谁知道问题是什么?我错过了什么?谢谢!

tor*_*rek 38

到目前为止,它已经在对其他答案的评论中,但这是完全正常的:一个新的存储库,"裸"或没有,没有提交,所以它也没有引用.

它确实有一个HEAD,它是HEAD在存储库(.git目录)中命名的文件,包含一个符号分支名称引用.如果您cat HEAD将看到ref: refs/heads/master,意味着新存储库是"在分支主服务器上",即使分支主服务器尚不存在.同样,这是完全正常的事态.在这一点上,你被说成是"未出生的分支".

当您添加一个或多个提交到这个空库,该master分支可以,如果它是一个裸露的回购协议,你可能会添加此通过git push它可以不提供master分支,所以我们不能说"不" :-)虽然平时master也先得在那时存在,引用指向新提交(或提交链的新提示).

在任何仓库(裸露与否,再次),您可以"在"不存在的分支上.特别是在普通仓库中,您可以:

$ git checkout --orphan newbranch
Run Code Online (Sandbox Code Playgroud)

这使你"上" newbranch(通过写ref: refs/heads/newbranchHEAD),而不实际创建 newbranch的是,制作newbranch一个"未出生的分支".然后,下一个提交将导致newbranch存在,并且该提交没有父提交(因此--orphan部分):它是一个新的根提交.这是同样的方式master开始存在于它的第一次提交.

如果您愿意,可以根据底层机制来看待它:当git创建一个新提交时,用于更新的步骤HEAD如下:1

  1. 读取HEAD文件内容.
  2. 它是一个象征性的参考,如ref: refs/heads/master?如果是,请转到步骤4.
  3. 否("分离的HEAD"情况):使用提交ID给出的父进行创建提交,HEAD并将新的SHA-1写入HEAD.停止,我们完成了.
  4. 读取引用分支的SHA-1(例如.git/refs/heads/master,或来自打包引用).
  5. 如果没有SHA-1可用,因为分支尚不存在,则创建根提交,否则创建其父级为给定SHA-1的提交.将新的SHA-1写入引用分支.停止,我们完成了.

作为一个有趣的旁注,当refs被打包时,"活跃"的那些(比如你正在开发的那个分支devel,比如让我们说)结束.git/packed-refs,但很快就会用新值更新.这些新值出现在.git/refs/heads/devel文件中:.git/packed-refs文件保留一个refs/heads/devel条目,但它是陈旧的(因此被忽略).(你不应该依靠这样的:外部程序,如shell脚本,应使用git branchgit update-ref或者git symbolic-ref,如适当,读写REF-名称和SHA-1的值有时,虽然,这是很有用,能够去直接编辑refs.把它想象成磁盘扇区的十六进制编辑器的现代版本.:-))


1这都假设您没有创建合并提交.如果您处于合并过程中,则repository(.git/MERGE_HEAD)中的另一个文件会提供额外的合并父ID.


小智 6

我有同样的问题并已修复 - 首先使用 git add 命令,然后使用 commit 命令,最后使用 gitbranch 来显示你的分支我的 git 版本 1.9

git add -A
git commit -m "initialize"
git branch
Run Code Online (Sandbox Code Playgroud)