TL;DR:您可能希望将共享 Git 配置为将 receive.denyCurrentBranch 设置为 updateInstead。在执行之前,请确保您确切知道这意味着什么!您更有可能将共享存储库配置为 bare 存储库。另见What are the consequences of using receive.denyCurrentBranch in Git?
长篇
git init samplerepo 创建一个名为samplerepo 的新空目录,然后在该目录中创建一个新的空存储库,因此samplerepo 是新空存储库的工作树。这个新的空存储库没有提交,因此(还)没有分支。 samplerepo 目录将只包含一个子目录.git,用于正确保存存储库。
创建了这个空存储库,然后克隆它。克隆过程会给你一个关于克隆空存储库的警告,因为在使用空存储库时,各种事情往往有点奇怪。在任何情况下,这个克隆也没有分支,因为像 master 这样的分支名称只能通过包含一些现有的有效提交的哈希 ID 来存在。空存储库没有提交。
尽管缺少分支,但空的存储库仍然在一个分支上。它只是在一个不存在的分支上。这就是奇怪之处。
接下来,您在克隆的工作树中创建了一个文件,使用git add 将该文件复制到此克隆的索引中,然后运行git commit。这在克隆中创建了第一个提交,该提交现在是非空的。创建此提交允许分支 master 出现,它确实做到了。 (如果您愿意,您现在可以创建无限数量的附加分支名称:所有必须,必然,识别这个存在的提交。)
最后,你告诉你的 Git 联系共享区域上的另一个 Git,//networkdrive/myrepo/samplegitrepo。1 你的 Git 将你所做的这个提交给了另一个 Git,Git 存储在该存储库 - 共享驱动器上的存储库。然后您的 Git 要求 Git 创建或更新其分支名称 master 以识别一个提交。确实如此。
在另一个 Git 中创建提交 对该 Git 的工作树没有影响。 这是 Git 存储库的正常行为:通过 git push 将新提交放入其中不会影响其工作树。事实上,一般来说,将新提交放入它已检出的分支中通常会完全拒绝。此处允许它的原因是它已签出的分支 - 它的 master - 不存在,原因与您的克隆的 master 最初不存在的原因相同。
现在分支确实存在,未来推送到master 的尝试将被拒绝,因为receive.denyCurrentBranch 未设置,这会导致与将其设置为@987654341 相同的行为@。在What are the consequences of using receive.denyCurrentBranch in Git?的各种答案中有很多讨论你应该阅读它。
1更典型的是,您会通过一些https:// 或ssh:// URL 联系一个完全独立的主机。然后,另一台主机将有一种方法来验证您并决定是否允许您访问那里的 Git 存储库。在这种情况下,您自己的 Git 会启动第二个 Git 实例以在共享驱动器中工作。这使得 Git 可以像在与另一台机器交谈一样继续工作,即使它只是与在共享驱动器中运行的另一个自身副本交谈。您的操作系统会通过共享驱动器自动处理身份验证。
这就是--shared 变得重要的地方,如果您打算让其他机器上的其他用户让他们的操作系统负责共享。面向 Linux 的 Git --shared=true 或 --shared=group 设置(这是 --shared 默认设置的)取决于 Linux 样式的组权限。您正在显示各种 Windows-ish 路径,并且 Windows 权限通常与 Linux 非常不同,因此这可能无法实现您想要的。我不“做”Windows,所以不知道如何完成您想要的,但值得关注。