当前位置: 首页 > Linux

Git本地仓库和裸仓库

时间:2023-04-06 22:40:10 Linux

通常我们会使用gitinit命令将我们所在的目录转换为Git本地仓库或者初始化一个新的空仓库。用法将当前目录转换为本地仓库gitinit执行该命令后,会在本地生成一个.git文件夹,用于跟踪仓库中的所有变化。效果如下:指定某个目录为本地仓库后,执行gitinit命令后,会创建一个名为repo的空目录,其中只包含.git子文件夹。效果如下:指定一个目录成为中央仓库(裸仓库)gitinit--bare这条命令执行后,会在本地创建一个名为repo的文件夹,里面包含了Git的基本目录。我们一般会以添加.git的形式命名这个文件夹,比如repo.git(这就是为什么我们从GitHub克隆仓库时,地址是xxx.git形式的原因)。效果如下:下面详细说一下使用--bare参数的意义。用--bare参数初始化的仓库一般称为裸仓库,因为这样创建的仓库是不包含工作空间的,也就是说我们不能在这个目录下执行我们一般使用的Git命令。比较下面对比一下直接用gitinit创建的仓库和带--bare参数的两个仓库。直接看两个仓库的config文件内容:gitinit直接创建的仓库:[core]repositoryformatversion=0filemode=truebare=falselogallrefupdates=trueignorecase=trueprecomposeunicode=true添加了-创建的bare-bareWarehouse:[core]repositoryformatversion=0filemode=truebare=trueignorecase=trueprecomposeunicode=true可以看到最直观的区别就是bare配置项是否为true,创建的本地仓库配置中有一个logallrefupdates不带--bare=true,从名字就可以看出功能,记录所有ref(reference)的更新,关于ref的部分可以写在后面,这个配置可以理解为Git的一道防线。功能差异我们可以用最简单的例子来说明。#直接创建本地库(Tao)?gitinitrepo#创建裸库(Tao)?gitinit--barerepo.git#分别克隆两个库(Tao)?gitclonerepoc1Cloninginto'c1'...warning:你似乎克隆了一个空的存储库。完成。(Tao)?gitclonerepo.gitc2Cloninginto'c2'...警告:你似乎克隆了一个空的存储库。完成。#进入c1库(Tao)?cdc1(Tao)?c1git:(master)touchtest(Tao)?c1git:(master)?gadd-A(Tao)?c1git:(master)?gcommit-m"testcommit"[master](root-commit)b1e32ad]testcommit1filechanged,0insertions(+),0deletions(-)createmode100644test(Tao)?c1git:(master)gitpushoriginmasterCountingobjects:3,done.Writing对象:100%(3/3),200字节|0字节/秒,完成。总计3(增量0),重复使用0(增量0)远程:错误:拒绝更新签出分支:refs/heads/masterremote:错误:默认情况下,更新当前分支在非barerepositoryremote:error:isdenied,因为它会使索引和工作树不一致entremote:error:和你推送的内容一样,需要'gitreset--hard'来匹配remote:error:theworktreetoHEAD.remote:error:remote:error:Youcanset'receive.denyCurrentBranch'configurationvariabletoremote:错误:远程存储库中的“忽略”或“警告”以允许推送到远程:错误:其当前分支;但是,除非您远程:错误:安排更新其工作树以匹配您在某个远程推送的内容,否则不推荐这样做:错误:其他方式。远程:错误:远程:错误:要压制此消息并仍然保持默认行为,setremote:错误:“receive.denyCurrentBranch”配置变量为“拒绝”。到/Users/tao/repo![remoterejected]master->master(branchiscurrentlycheckedout)error:failedtopushsomerefsto'/Users/tao/repo'#进入c2库重新执行(Tao)?c1git:(master)cd../c2(Tao)?c2git:(master)touchtest(Tao)?c2git:(master)?gitadd-A(Tao)?c2git:(master)?gitcommit-m"testcommit[master(root-commit)7aacc58]testcommit1filechanged,0insertions(+),0deletions(-)createmode100644test(Tao)?c2git:(master)gitpushoriginmasterCounting对象:3,done.Writingobjects:100%(3/3),201bytes|0bytes/s,done.Total3(delta0),重复使用0(delta0)To/Users/tao/repo.git*[newbranch]master->master从裸仓库克隆出来的本地仓库可以进行正常的push操作,但是从普通仓库克隆出来的本地仓库不能,这就是裸仓库存在的意义,裸仓库一般作为远程中央仓库是存在的,综上所述,使用gitinit--bare可以创建一个裸仓库,这个仓库可以通过正常的clone和push进行更新,裸仓库不包含工作空间,所以不存在于裸仓如果想直接在网站上提交修改,可以联系公众号TheMoeLove