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

Aer*_*oss 188 git repository git-bare

我一直在阅读Git中的裸机和非裸机/默认存储库.我无法理解(理论上)它们之间的差异,以及为什么我应该"推"到一个裸存储库.这是交易:

目前,我是唯一一个在3台不同计算机上工作的人,但是后来会有更多人参与其中,所以我使用Git进行版本控制.我在所有计算机上克隆了裸仓库,当我在其中一台计算机上完成修改后,我提交并将更改推送到裸仓库.从我所读到的,裸存储库没有"工作树",所以如果我克隆裸仓库,我将没有"工作树".

我猜测工作树存储项目中的提交信息,分支等.这不会出现在裸仓库中.因此,对于我来说,使用工作树将提交"推送"到repo似乎更好.

那么,为什么我应该使用裸存储库,为什么不呢?有什么实际区别?我认为,这对于从事项目的更多人来说没有好处.

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

Der*_*har 88

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

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

从手册页git clone --bare:

远程处的分支头也直接复制到相应的本地分支头,而不将它们映射到refs/remotes/origin /.使用此选项时,既不会创建远程跟踪分支,也不会创建相关的配置变量.

据推测,当它创建一个裸存储库时,Git假定裸存储库将作为几个远程用户的源存储库,因此它不会创建默认的远程源.这意味着基本git pullgit push操作将无法工作,因为Git假设没有工作空间,您不打算对裸存储库进行任何更改:

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 
Run Code Online (Sandbox Code Playgroud)

  • 非裸存储库也不一定具有默认的远程"源". (8认同)
  • mipadi,这是真的,但它也不是克隆。 (3认同)
  • 是的,我同意这可以说是裸 Git 存储库和非裸 Git 存储库之间最显着的区别。非裸仓库有工作区,但裸仓库不是一个重要的区别,但 `git clone --no-checkout` 也可以创建一个没有工作区文件的非裸仓库。 (2认同)
  • 您可以使用`git init`创建一个Git存储库,它将创建一个没有指定远程的非裸存储库. (2认同)
  • 这是不正确的。如果存储库已被“克隆”,则存储库将具有默认来源。如果它已经在本地进行了`init`,则它不会有这样的来源。这与是否裸露无关。 (2认同)

Der*_*har 57

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

Git命令git clonegit init两者都有选项--bare,可以创建没有初始工作空间的存储库.不幸的是,Git将两个独立但相关的工作空间和存储库概念混合在一起,然后使用令人困惑的术语" 裸"来区分这两个想法.

  • 你提出的观点非常好。说“非裸 git 存储库有补充工作区目录树(但裸 git 存储库没有)”是否正确? (3认同)

Dee*_*rma 56

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

  • 在远程服务器上使用裸存储库以允许多个贡献者推动他们的工作.
  • 非裸 - 具有工作树的那个在您项目的每个贡献者的本地机器上是有意义的.

  • 多个贡献者就不能共同推动他们的工作吗?不需要裸存储库。无论如何,使用普通的存储库,很多人都可以并行工作。 (2认同)

EML*_*EML 53

我知道,已经晚了5年,但实际上没有人回答这个问题:

那么,为什么我应该使用裸存储库,为什么不呢?有什么实际区别?我认为,这对于从事项目的更多人来说没有好处.

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

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

裸露的存储库似乎没什么用处,但它的作用至关重要:作为协作开发的权威焦点.其他开发人员clonefetch裸存储库及其push更新...如果您设置了一个开发人员push更改的存储库,它应该是裸的.实际上,这是更常见的最佳实践的特例,即已发布的存储库应该是裸露的.

  • 这应该是公认的答案。做得好。 (2认同)

Gre*_*wen 23

默认/非裸 Git 存储库包含两个状态:

  1. 一个快照的所有文件的存储库中的(这是Git的行话是什么“工作树”的意思)
  2. 对存储库中所有文件所做的所有更改的历史记录(似乎没有包含所有这些的简洁的 Git 术语)

快照是什么,你可能认为的项目:你的代码文件,生成文件,辅助脚本和其他任何你的版本使用Git。

历史上是允许你检查出不同的提交,并得到一个什么在你的仓库中的文件看犯下加入时像一个完整的快照状态。它由一堆 Git 内部的数据结构组成,您可能从未直接与之交互过。重要的是,历史不仅存储元数据(例如“用户 U 在时间 T 将这么多行添加到文件 F 作为提交 C 的一部分”),它还存储数据(例如“用户 U 将这些确切的行添加到文件 F”) )。

裸存储库的关键思想是您实际上不需要拥有快照。Git 保留快照是因为它对于想要与您的代码交互的人类和其他非 Git 进程来说很方便,但快照只是复制历史中已经存在的状态。

一个纯仓库是不具有快照的Git仓库。它只是存储历史。

你为什么要这个?好吧,如果您只打算使用 Git 与您的文件进行交互(也就是说,您不打算直接编辑您的文件或使用它们来构建可执行文件),那么您可以通过不保留快照来节省空间。特别是,如果您在某处的服务器上维护一个集中版本的仓库(即您基本上托管自己的 GitHub),那么该服务器可能应该有一个裸仓库(您仍然会在您的服务器上使用非裸仓库)本地机器,因为您可能想要编辑您的快照)。

如果你想更深入地解释裸仓库和另一个示例用例,我在这里写了一篇博文:https : //stegosaurusdormant.com/bare-git-repo/

  • 这个答案对于理解差异最有用。谢谢 (5认同)
  • “非裸”存储库还包含持续开发所需的暂存区域 /sf/ask/3445974661/ (2认同)

mip*_*adi 19

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

  • mipadi,非裸存储库可能没有签出树.如果您使用`git clone --no-checkout`创建非裸存储库,则会出现这种情况.在这种情况下,非裸存储库具有工作空间的位置,但Git不会将任何文件签出到该工作空间. (2认同)

seh*_*ehe 15

裸存储库有益处

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

  • 那么裸存储库是最好/推荐的方式与几个无法访问他们的存储库的人一起工作?(有点像SVN?) (3认同)
  • AeroCross,我说裸机库是这种情况的不错选择. (2认同)

小智 11

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

仅通过从其他存储库传输更改来更改裸存储库.


Buv*_*inJ 9

我当然不是Git"专家".我已经使用过TortoiseGit一段时间了,当它问我是否想要创建一个"裸"回购时,我想知道它在说什么.我正在阅读本教程: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等远程存储/分发回购就是一个创建"裸"仓库的例子.如果你要建立自己的类似"共享中心",你可以自己制作一个.