在没有主分支的情况下创建的 Git 存储库

标签 git repository git-branch

我想为一个新项目(在 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

  1. 读取HEAD文件的内容。
  2. 是否是符号引用,例如 ref: refs/heads/master?如果是,转到第 4 步。
  3. 否(“分离的 HEAD”情况):使用 HEAD 中的提交 ID 给定的父项创建提交,并将新的 SHA-1 写入 HEAD。停下来,我们完成了。
  4. 读取引用分支的 SHA-1(例如,.git/refs/heads/master,或来自打包的 refs)。
  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-refgit symbolic-ref 适本地,读取和写入 ref-names 和 SHA-1 值。不过,偶尔,能够直接进入并编辑 refs 是很有用的。可以将其视为现代的十六进制编辑器对于磁盘扇区。:-) )


1这一切都假设您没有创建 merge 提交。如果您正在 merge 中,存储库中的另一个文件 (.git/MERGE_HEAD) 会提供额外的 merge 父 ID。

关于在没有主分支的情况下创建的 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21252876/

相关文章:

android - mvvm android 中的存储库可以是单例吗?

混帐 : empty ident name (for <>) not allowed

git - 我在哪里可以找到 git-svn for redhat 7 缺少的依赖项

git - 在 Git 中拥有文档和其他项目相关文件的最佳实践?

azure - 没有人有权访问 Azure DevOPs 中的存储库

git - 在私有(private) git 服务器上分支公共(public) git 存储库

git - 如何将提交重播到已经包含提交的分支上?

git - 为什么git需要stash save-pop来切换分支?

git - 如何将我的本地存储库与 GitHub 上的中央存储库同步?

git - 如何将文件从master分支推送到另一个分支?