我猜“工作树”存储项目的提交信息、分支等。这些不会出现在裸存储库中。因此,似乎最好将提交推送到具有“工作树”的存储库。
那么,为什么要使用裸存储库,而不使用默认存储库?实际的区别是什么?这对于更多参与项目的人来说可能没有好处。
您对此类工作的方法是什么?有什么建议吗?
裸库和非裸库之间的另一个区别是,裸库没有默认远程存储库origin:
~/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 clone --bare
的手册页面:
而且,远程仓库的分支头直接复制到相应的本地分支头,而不映射到refs/remotes/origin/。使用此选项时,既不创建remote-tracking分支,也不创建相关的配置变量。
假设创建裸仓库时,Git会认为裸仓库将作为多个远程用户的起源存储库,因此它不会创建默认的远程origin。这意味着基本的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 clone --no-checkout
也可以创建一个没有工作区文件的非裸仓库。 - Derek Mahargit init
命令简单地创建一个 Git 仓库,这将创建一个未指定远程的非裸仓库。 - mipadiclone
了,它将会有一个默认的远程源。如果它在本地被 init
了,它就没有这样的远程源。这与它是否为裸仓库无关。 - Noufal Ibrahim我知道已经晚了5年,但是没有人真正回答这个问题:
那么,为什么应该使用裸库,为什么不使用?有什么实际区别吗?我想这对更多在一个项目上工作的人来说并不会有益处。
你们处理这种工作的方法是什么?有什么建议吗?
引用Loeliger/MCullough书(ISBN 978-1-449-31638-9,第196/7页)的话:
裸库似乎没有什么用处,但其角色却至关重要:作为协作开发的权威焦点。其他开发者从裸库中克隆和提取(fetch),并将更新推送(push)到其中...如果您设置了一个开发者
push
更改的库,它应该是裸库。实际上,这是更一般的最佳实践的特例,即公开的存储库应该是裸的。
git clone
命令。而非bare则相反,即在仓库文件夹内有一个工作区,你可以在其中编辑和提交所有文件,但不能从外部推送任何内容进来。 - undefined裸仓库指的是 .git 文件夹本身,即裸仓库的内容与本地工作仓库中 .git 文件夹的内容相同。
非裸仓库只是一个已检出的工作树。工作树不存储有关仓库状态(分支、标签等)的任何信息;相反,工作树只是实际存储在仓库中文件的表示,它允许您对文件进行操作(编辑等)。
git clone --no-checkout
创建非裸库,则会出现这种情况。在这种情况下,非裸库有一个工作区位置,但是Git不会将任何文件检出到该工作区。 - Derek Mahar裸仓库有以下优点:
非裸库允许您(进入您的工作树)通过创建新的提交来捕获更改。
裸库仅通过从其他存储库传输更改来进行更改。
我并不是Git的“专家”。 我已经使用TortoiseGit一段时间了,每当我创建一个时,就会问我是否要创建一个“bare” repo。我正在阅读这个教程:https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init,它解决了这个问题,但我仍然不太理解概念。这篇文章帮了我很多:http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html。现在,第一篇文章也有意义了!
根据这些来源,在简短地说,一个“bare” repo用于在服务器上设置分发点。 它不适用于您的本地计算机。 通常,您将提交从本地计算机推送到远程服务器上的裸库,您和/或其他人从该裸库中拉出到本地计算机。 因此,您的GitHub、Assembla等远程存储/分发repo是创建“bare” repo的示例。 如果您要设置自己的类似“共享中心”,则可以自己创建一个。
这并不是一个新的答案,但它帮助我理解以上答案的不同方面(而且对于评论来说太长了)。
只需使用Git Bash尝试:
me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/
me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 .git/
me@pc MINGW64 /c/Test (master)
$ cd .git
me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr 1 11:35 config
-rw-r--r-- 1 myid 1049089 73 Apr 1 11:35 description
-rw-r--r-- 1 myid 1049089 23 Apr 1 11:35 HEAD
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 hooks/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 info/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 objects/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:35 refs/
git --bare
一样:me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/
me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr 1 11:36 config
-rw-r--r-- 1 myid 1049089 73 Apr 1 11:36 description
-rw-r--r-- 1 myid 1049089 23 Apr 1 11:36 HEAD
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 hooks/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 info/
drwxr-xr-x 1 myid 1049089 0 Apr 1 11:36 objects/
git clone
命令,您可以自由地在裸仓库和非裸仓库之间进行转换。 - Derek Mahargit clone --bare
,你将得到一个裸库(bare repo),如果你运行git clone
,你将得到一个非裸库(non-bare one)。你曾经克隆过的每个公共项目(例如在Github上托管的)在另一端都是一个裸库(bare repository)。 - Cascabel