我想为一个新项目(在 VM 上)创建一个新的共享 git 存储库。
我从 /.../git/new_proj.git
运行了 git --bare init
,但是在 .. ./git/new_proj.git/refs/heads
目录。
我还在我的目录上运行了 sudo chmod 777 -R
,但它没有帮助,在 init
命令之后仍然没有创建 master。
编辑:
我什至尝试使用 git init
(没有 bare 标志),但仍然没有创建 master 分支。
Google 在这件事上帮不上什么忙...
有人知道问题出在哪里吗?我缺少什么?谢谢!
最佳答案
它已经在other answer so far 的评论中了。 , 但这是完全正常的:一个新的存储库,无论是否“裸”,都没有提交,所以它也没有引用。
它确实有一个 HEAD
,它是存储库(.git
目录)中名为 HEAD
的文件,包含一个符号分支名称引用。如果您cat HEAD
,您将看到ref: refs/heads/master
,这意味着新存储库“在分支主机上”,即使分支主机在尚不存在。同样,这是完全正常的事态。在这一点上,你被称为“在未出生的分支上”。
当你向这个空仓库添加一个或多个提交时,master
分支可以——如果它是一个裸仓库,你可以通过 git push
添加它,这可能不提供 master
分支,所以我们不要说“做”:-) 虽然通常 master
会做——在那一点上存在,引用指向新的提交(或提交链的新提示提交)。
在任何 repo 协议(protocol)中(同样是裸的或不裸的),你可以“在”一个不存在的分支上。特别是,在普通 repo 中,您可以:
$ git checkout --orphan newbranch
它让你“开启”newbranch
(通过将 ref: refs/heads/newbranch
写入 HEAD
)而不实际 创建 newbranch
但是,使 newbranch
成为“未出生的分支”。然后下一次提交导致 newbranch
出现,并且该提交没有父提交(因此 --orphan
部分):它是一个新的根提交。这与 master
在它的 第一次提交时出现的方式相同。
如果你愿意,你可以从底层机制的角度来看它:当git创建一个新的提交时,用于更新HEAD
的步骤是这样的:1
- 读取
HEAD
文件的内容。 - 是否是符号引用,例如
ref: refs/heads/master
?如果是,转到第 4 步。 - 否(“分离的 HEAD”情况):使用
HEAD
中的提交 ID 给定的父项创建提交,并将新的 SHA-1 写入HEAD
。停下来,我们完成了。 - 读取引用分支的 SHA-1(例如,
.git/refs/heads/master
,或来自打包的 refs)。 - 如果由于分支尚不存在而没有可用的 SHA-1,则创建根提交,否则创建其父级为给定 SHA-1 的提交。将新的 SHA-1 写入引用分支。停下来,我们完成了。
作为一个有趣的旁注,当 refs 被打包时,“事件”的(比如你正在开发的任何分支,例如 devel
)结束在 .git/packed-refs
,但会快速更新为新值。这些新值仅在 .git/refs/heads/devel
文件中:.git/packed-refs
文件保留了一个 refs/heads/devel
条目,但它已过时(因此被忽略)。 (你不应该依赖于此:外部程序,例如 shell 脚本,应该使用 git branch
或 git update-ref
或 git symbolic-ref
适本地,读取和写入 ref-names 和 SHA-1 值。不过,偶尔,能够直接进入并编辑 refs 是很有用的。可以将其视为现代的十六进制编辑器对于磁盘扇区。:-) )
1这一切都假设您没有创建 merge 提交。如果您正在 merge 中,存储库中的另一个文件 (.git/MERGE_HEAD
) 会提供额外的 merge 父 ID。
关于在没有主分支的情况下创建的 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21252876/