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

时间:2014-01-21 08:33:13

标签: git repository git-branch

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

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

修改 我甚至尝试使用git init(没有裸标志),但仍未创建主分支。

谷歌在这件事上没有多大帮助...

任何人都知道问题是什么?我错过了什么?谢谢!

3 个答案:

答案 0 :(得分:36)

它已经在other answer so far的评论中了,但这是完全正常的:一个新的存储库,“裸”或不存在,没有提交,所以它也没有引用。

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

当您向此空存储库添加一个或多个提交时,master分支可以 - 如果它是一个裸存储库,您可能会通过git push添加此提交,这可能不提供{{1}分支,所以我们不要说“确实”:-)虽然通常master确实在那时出现,引用指向新的提交(或提交链的新提示)。

在任何仓库(裸露与否,再次),你可以“在”一个不存在的分支上。特别是,在普通仓库中,您可以这样做:

master

这会让你“$ git checkout --orphan newbranch (通过将newbranch写入ref: refs/heads/newbranch),而不会实际创建 HEAD,而{{1}一个“未出生的分支”。然后,下一次提交会导致newbranch成立,并且该提交没有父提交(因此newbranch部分):它是一个新的根提交。这与 首次提交时newbranch相同。

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

  1. 阅读master档案的内容。
  2. 这是HEAD这样的象征性参考吗?如果是,请转到步骤4.
  3. 否(“分离的HEAD”情况):使用HEAD中的提交ID给出父级创建提交,并将新SHA-1写入ref: refs/heads/master。停止,我们完成了。
  4. 读取引用分支的SHA-1(例如,HEAD或来自打包引用)。
  5. 如果没有SHA-1可用,因为分支尚不存在,请创建root commit,否则创建其父级为给定SHA-1的commit。将新的SHA-1写入引用分支。停止,我们完成了。
  6. 作为一个有趣的旁注,当refs被打包时,“活跃”的那些(就像你正在开发的那个分支,比如说HEAD)会在.git/refs/heads/master结束,但很快使用新值更新。这些新值仅在devel文件中 .git/packed-refs文件保留.git/refs/heads/devel条目,但它已过时(因此被忽略)。 (您不应该依赖于此:外部程序,例如shell脚本,应该使用.git/packed-refsrefs/heads/develgit branch来适当地读取和写入引用名称和SHA但是,有时候,能够直接进入并编辑refs是很有用的。可以把它想象成磁盘扇区的十六进制编辑器的现代版本。:-))


    1 这都假设您没有创建合并提交。如果您在合并过程中 ,则存储库中的另一个文件(git update-ref)会提供额外的合并父ID。

答案 1 :(得分:2)

裸git repos(通过发布git init --bare创建的repos)将不会附加工作树。 您可以做的是转到repo /.../git/new_proj.git并添加您创建的远程仓库:git remote add bare_origin <link to bare repo>,然后尝试将您的提交推送到此bare_origin回购表单。

另外,在创建裸存储库而不是普通存储库时,您有什么特别的原因吗?

答案 2 :(得分:2)

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

git add -A
git commit -m "initialize"
git branch