Lite Git (II) - Initialize
前言
本专栏名为Lite Git。主要想与Pro Git对应,后者为Git官方指南,有兴趣,或者想了解更多细节的同学,请移步官网下载PDF版。
本专栏主要为了让初出茅庐的同学更快、更合理地掌握Git的基本运用;
同时,本专栏也会介绍一下作为Android开发人员关心的:repo的运用;
本篇是该专栏的第二篇,主要介绍Git的仓储创建,已经了解的可以跳过此篇;
何为git仓库 (git repository)
顾名思义,由git管理的一个目录,可以称之为一个git仓库;
git仓库的创建
git仓库可以通过如下方式创建:
git init
任何一个git仓库都是可以既为服务端,又为客户端的,这也是git所标榜的分布式的一种表现;
具体来说,git init
命令常用使用方法有如下几种:
- 将一个现有目录转化为一个git仓库:
#将当前目录转化为一个git仓库; git init
- 创建一个新的裸仓库:
#创建一个名为demo的git裸仓库; git init --bare demo
- 创建一个新的空仓库:
#创建一个名为demo的git仓库; git init demo
关于裸仓库与常规仓库的区别,这里用一个实例来解答:
#创建一个名为demo_normal的常规git仓库
ryan ~/git_demo $ git init demo_normal
Initialized empty Git repository in /home/ryan/git_demo/demo_normal/.git/
#创建一个名为demo_bare的git裸仓库
ryan ~/git_demo $ git init --bare demo_bare
Initialized empty Git repository in /home/ryan/git_demo/demo_bare/
#查看demo_normal这个仓库的目录结构
ryan ~/git_demo $ ll demo_normal/
total 12
drwxr-xr-x 3 ryan ryan 4096 Oct 26 16:23 ./
drwxr-xr-x 4 ryan ryan 4096 Oct 26 16:23 ../
drwxr-xr-x 7 ryan ryan 4096 Oct 26 16:23 .git/
#查看demo_normal这个仓库内的.git目录结构
ryan ~/git_demo $ ll demo_normal/.git/
total 40
drwxr-xr-x 7 ryan ryan 4096 Oct 26 16:23 ./
drwxr-xr-x 3 ryan ryan 4096 Oct 26 16:23 ../
-rw-r--r-- 1 ryan ryan 23 Oct 26 16:23 HEAD
drwxr-xr-x 2 ryan ryan 4096 Oct 26 16:23 branches/
-rw-r--r-- 1 ryan ryan 92 Oct 26 16:23 config
-rw-r--r-- 1 ryan ryan 73 Oct 26 16:23 description
drwxr-xr-x 2 ryan ryan 4096 Oct 26 16:23 hooks/
drwxr-xr-x 2 ryan ryan 4096 Oct 26 16:23 info/
drwxr-xr-x 4 ryan ryan 4096 Oct 26 16:23 objects/
drwxr-xr-x 4 ryan ryan 4096 Oct 26 16:23 refs/
#查看demo_bare这个仓库的目录结构
ryan ~/git_demo $ ll demo_bare/
total 40
drwxr-xr-x 7 ryan ryan 4096 Oct 26 16:23 ./
drwxr-xr-x 4 ryan ryan 4096 Oct 26 16:23 ../
-rw-r--r-- 1 ryan ryan 23 Oct 26 16:23 HEAD
drwxr-xr-x 2 ryan ryan 4096 Oct 26 16:23 branches/
-rw-r--r-- 1 ryan ryan 66 Oct 26 16:23 config
-rw-r--r-- 1 ryan ryan 73 Oct 26 16:23 description
drwxr-xr-x 2 ryan ryan 4096 Oct 26 16:23 hooks/
drwxr-xr-x 2 ryan ryan 4096 Oct 26 16:23 info/
drwxr-xr-x 4 ryan ryan 4096 Oct 26 16:23 objects/
drwxr-xr-x 4 ryan ryan 4096 Oct 26 16:23 refs/
可见:
- 常规仓库的git仓库信息会保存在一个名为
.git
的子目录中; - 裸仓库则直接将git仓库信息保存在仓库根目录下;
此外补充一下裸仓库的信息:
裸仓库主要是用于服务端保存,这种保存方式由于根目录用于保存git仓库信息,因此没有工作区的概念,git追踪的文件也无法checkout出来。
得益于此,裸仓库占用的磁盘空间会比常规仓库少,同时不会出现本地工作区所处分支与git仓库分支不对应的情况;
git仓库的克隆
以上方创建的demo_bare
裸库为例。假设这个仓库为服务端的版本,那么如果我们想基于此仓库进行开发,则需要将其克隆至本地:
#本地克隆,可直接指定仓库路径,此例则为将~/git_demo/demo_bare这个仓库克隆到当前目录下,命名为demo_client
git clone ~/git_demo/demo_bare demo_client
#http克隆(需要http服务器)
git clone https://172.0.0.1/git_demo/demo_bare demo_client
#ssh克隆(需要ssh通畅)
git clone ryan@172.0.0.1:~/git_demo/demo_bare demo_client
同理,如果希望克隆一个仓库作为二级镜像,git clone
命令也支持克隆为裸仓库:
git clone ~/git_demo/demo_bare demo_client --bare
git仓库间的关联
以上方克隆的名为demo_client
的裸仓库为例,我们通过查看其根目录下的config
文件确认其与demo_bare
的关系:
ryan ~/git_demo $ cat demo_client/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
[remote "origin"]
url = /home/ryan/git_demo/demo_bare
可以看见,我们的git clone
的行为实际上通过[remote "origin"]
这样一个字段记录下来了,其中的url
实际上就是demo_bare
仓库所在位置;
下图可以表示demo_client
与demo_bare
的关系,注意箭头是单向的,表示demo_client
知道demo_bare
的存在,并将其设定为同步进度的上游,但demo_bare
并不知道demo_client
的存在(也不需要知道),也不关心有多少仓库将自己设定为上游了,只要安全校验通过,就可以从demo_client
同步进度;