Bare和非Bare存储库之间的实际区别是什么?

我一直在阅读关于Git的裸和非裸/默认存储库。 我理解不了它们之间的差异,为什么我要“推”到一个裸仓库。 这是交易:

目前,我是唯一一个在三台不同计算机上工作的项目,但后来会有更多人参与,所以我使用Git进行版本控制。 我克隆所有计算机上的裸回购,当我完成对其中一个计算机的修改时,我承诺并将更改推送到裸回购。 从我读过的内容来看,裸仓库没有“工作树”,所以如果我克隆裸仓库,我就不会有“工作树”。

我猜测工作树存储了项目中的提交信息,分支等。 这不会出现在裸回购。 所以对我来说,用工作树“推”提交到回购库似乎更好。

那么, 为什么我应该使用裸仓库,为什么呢? 有什么实际的区别? 我想,这对于更多从事项目工作的人是没有好处的。

你做这种工作的方法是什么? build议?

裸仓库和非仓库仓库之间的另一个区别是裸仓库没有默认的远程仓库:

 derek@derek-OptiPlex-960:~/Projects$ git clone --bare test bare Initialized empty Git repository in /home/derek/Projects/bare/ derek@derek-OptiPlex-960:~/Projects$ cd bare derek@derek-OptiPlex-960:~/Projects/bare$ git branch -a * master derek@derek-OptiPlex-960:~/Projects/bare$ cd .. derek@derek-OptiPlex-960:~/Projects$ git clone test non-bare Initialized empty Git repository in /home/derek/Projects/non-bare/.git/ cd nonderek@derek-OptiPlex-960:~/Projects$ cd non-bare derek@derek-OptiPlex-960:~/Projects/non-bare$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master 

git clone --bare的手册页git clone --bare

此外,远程的分支机构直接复制到相应的本地分支机构,而不会将它们映射到refs / remotes / origin /。 使用此选项时,不会创build远程跟踪分支和相关configurationvariables。

据推测,当它创build一个裸存储库时,Git假定裸存储库将作为多个远程用户的源存储库,所以它不会创build默认的远程源。 这意味着基本的git pullgit push操作将不起作用,因为Git假定没有工作空间,您不打算对裸仓库提交任何更改:

 derek@derek-OptiPlex-960:~/Projects/bare$ git push fatal: No destination configured to push to. derek@derek-OptiPlex-960:~/Projects/bare$ git pull fatal: /usr/lib/git-core/git-pull cannot be used without a working tree. derek@derek-OptiPlex-960:~/Projects/bare$ 

裸露和非裸露的Git存储库之间的区别是人为和误导性的,因为工作区不是存储库的一部分,而且存储库不需要工作区。 严格地说,一个Git仓库包含那些描述仓库状态的对象。 这些对象可能存在于任何目录中,但通常存在于工作空间的顶级目录中的.git目录中。 工作空间是一个目录树,它代表了存储库中的一个特定的提交,但它可能存在于任何目录中,或根本不存在。 环境variables$GIT_DIR将工作空间链接到它所源自的存储库。

Git命令git clonegit init都有选项--bare不用创build工作空间就可以创build存储库。 不幸的是,Git将工作空间和知识库这两个独立但相关的概念混为一谈,然后用混淆的术语来区分这两个概念。

存储器只是.git文件夹本身,即裸存储库的内容与本地工作存储库中的.git文件夹的内容相同。

  • 在远程服务器上使用裸存储库以允许多个贡献者推送他们的工作。
  • 非裸露 – 在工作树的每一个贡献者的本地机器上都是有意义的。

一个非裸仓库只是有一个检出工作树。 工作树不存储任何有关资源库状态的信息(分支,标签等)。 相反,工作树只是repo中实际文件的一个表示,它允许您处理(编辑等)文件。

5年过去了,我知道,但没有人真的回答了这个问题:

那么,为什么我应该使用裸仓库,为什么呢? 有什么实际的区别? 我想,这对于更多从事项目工作的人是没有好处的。

你做这种工作的方法是什么? build议?

直接引用Loeliger / MCullough的书(978-1-449-31638-9,p196 / 7):

一个裸仓库似乎没什么用处,但它的作用至关重要:作为协作开发的权威协调中心。 其他开发人员从裸存储库中clonefetchpush更新push送给它…如果您设置了开发人员push更改的存储库,则该数据库应该是裸露的。 实际上,这是发布的仓库应该是裸露的更一般的最佳实践的特例。

裸仓库有益于

  • 减less磁盘使用量
  • 与远程推送相关的更less的问题(因为没有工作树在那里不同步或有冲突的变化)

非裸存储库允许您(进入您的工作树)通过创build新的提交来捕获更改。

只有通过从其他存储库传输更改才能更改裸存储库。

我当然不是Git“专家”。 我已经使用了TortoiseGit一段时间,并且想知道当它问我是否想创build一个“裸”回购时它是在说什么。 我正在阅读本教程: https : //www.atlassian.com/git/tutorials/setting-up-a-repository/git-init ,它解决了这个问题,但我仍然不完全理解这个概念。 这一个帮助了很多: http : //bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html 。 现在,第一个也是有意义的!

根据这些资料来源,简而言之,在要设置分发点的服务器上使用“裸”回购。 它不适合在本地机器上使用。 您通常会将提交从本地计算机推送到远程服务器上的裸回购,而您和/或其他人则从裸回购计划提取到本地计算机。 因此,您的GitHub,Assembla等远程存储/分发回购是一个“裸”回购的例子。 如果你build立了自己的类似“共享中心”,你可以自己创build一个。