我一直在阅读Git中的裸库和非裸库/默认库。我还不能很好地(从理论上)理解它们之间的区别,以及为什么我应该“推送”到一个裸库。事情是这样的:

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

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

那么,为什么我应该使用裸库,为什么不呢?实际的区别是什么?我想,这对更多人参与一个项目没有好处。

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


当前回答

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

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

其他回答

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

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

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

裸存储库的好处在于

减少磁盘使用率 与远程推送相关的问题更少(因为没有工作树不同步或有冲突的更改)

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

~/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

从手册页的git克隆——bare:

同时,分支的头在远程 是否直接复制到相应的 本地分支头,没有映射 它们指向refs/remotes/origin/。当 这两个选项都没有使用 远程跟踪分支机构也没有 相关配置变量为 创建。

假设,在创建裸存储库时,Git假定裸存储库将作为几个远程用户的原始存储库,因此它不会创建默认的远程源存储库。这意味着基本的git pull和git 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$ 

裸库就是。git文件夹本身,即裸库的内容与本地工作库中。git文件夹的内容相同。

在远程服务器上使用裸存储库允许多个贡献者推送他们的工作。 Non-bare——在项目的每个贡献者的本地机器上有工作树的那个。