GitHub仓库和Git裸仓库有什么区别?

15
在Github代码库中,我们可以进行“git push”、“git pull”操作,同时也可以通过Web UI提交到代码库。看起来,Github的代码库同时作为裸库和工作库?
然而,在Git裸仓库中,我们不能将目录提交到代码库中。
所以,我的问题是:
Github仓库和Git裸仓库之间的真正区别是什么?
3个回答

17
“看起来 GitHub 存储库既可以作为工作存储库又可以作为裸存储库,这是否意味着 GitHub 存储库是从 git 裸存储库开发而来的?”
不是的,GitHub 上的 Git 存储库是裸的,就像你想要推送到的任何远程存储库一样。他们的 Web 界面向您展示了 Git 存储库内容的表示形式,并且他们可能会使用临时工作树直接从 Web UI 修改文件(对于他们在 2011年 首次引入的内联编辑),但这是他们自己的内部机制。从客户端的角度来看,您可以将它们视为经典的裸存储库。

所有远程repo都是bare repo吗?非bare repo可以作为远程repo吗? - Boon
@Boon 自从最近的 Git 版本(Git 2.3+,2015 年 2 月)以来,非裸库可以作为远程库。请参见 https://dev59.com/xXRA5IYBdhLWcg3w2xsI#28262104。并且在 pushtodeploy git 2.4 中:https://dev59.com/tWDVa4cB1Zd3GeqPb0dX#30030236。 - VonC

3
GitHub是一个“社交网站”,允许用户在该网站上托管他们的源代码。它提供了多种编辑源代码的方式:
- 使用Web界面直接编辑 - 使用git push更新 - 使用svn集成 svn commit提交更改 - ...(也许还有我不知道的)
根据您的角度,您可能会做出各种猜测:
- 如果只使用Web界面编辑文件,则似乎您正在编辑非裸仓库中的文件。 - 如果只使用git命令进行推送和拉取,则似乎您正在与另一端的裸git仓库通信。 - 如果只使用Subversion命令,则似乎您正在与另一端的Subversion仓库通信。 - 如果您同时意识到所有这些问题,则可以猜测所有不同的访问方式都归结为相同的内部机制。
GitHub提供了大量额外的魔法来隐藏内部细节。我猜想核心部分可能有裸git仓库。Web界面可能使用原始裸仓库的非裸克隆或文件的工作树,并使用git命令以以下方式: GIT_DIR=/path/to/bare.git git somecommand。实际上,它可能比那更复杂。
从技术上讲,它们甚至不需要在底层使用Git仓库。实际上,他们可能正在使用SomeSystemXYZ,该系统实现了所有必要的协议,以呈现出您正在使用Git或Subversion存储库的外观。只有查看其源代码,您才能真正了解一个网站的工作原理。

但似乎 GitHub 存储库可以同时作为工作存储库和裸存储库,这是否意味着 GitHub 存储库是从 Git 裸存储库开发而来,并在裸存储库上添加了其他功能(如直接提交、问题等)? - Charles0429
@Charles0429 我澄清了我的回答。 - janos

0
这句话摘自于使用Git进行版本控制裸仓库和开发仓库 Git 仓库可以是裸仓库或开发(非裸)仓库。开发仓库用于日常开发,它维护当前分支的概念,在工作目录中提供当前分支的检出副本。到目前为止,本书中提到的所有仓库都是开发仓库。相比之下,裸仓库没有工作目录,不应该用于正常开发。裸仓库也没有所谓的已检出分支。将裸仓库想象成仅仅是 .git 目录的内容。换句话说,不应该在裸仓库中进行提交。裸仓库可能看起来毫无用处,但其角色至关重要:作为协作开发的权威焦点。其他开发人员从裸仓库克隆和提取,并向其推送更新。我们将在本章后面的示例中演示如何将所有这些内容整合在一起。如果使用 --bare 选项发出 git clone 命令,则 Git 将创建一个裸仓库;否则,将创建一个开发仓库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接