文章目录
初始化仓库git init和git init --bare的区别
我们搭建好一个Git服务器后,在初始化仓库,往往使用
git init
或
git init --bare
来初始化项目。但是,这两个的区别是什么呢?
- git init: 建立一个标准的git仓库 建立一个标准的Git仓库,这样的仓库初始化后,其项目目录为工作空间,其下的.git目录是版本控制器。可以正常的进行源文件的编写,提交等各种git常规操作。
通常我们会用 git init 命令来将我们所在的目录转换为一个 Git 本地仓库或者初始化一个新的空仓库。**
git init
命令执行后会在本地生成一个 .git 的文件夹,用来追踪仓库的所有变更。**
- git init --bare: 指定某个目录成为中心仓库(裸仓库) 通常,我们初始化远程服务器仓库时,使用
git init --bare <repo>
:建立一个“裸”的gt仓库。这样的仓库初始化后,其项目目录下就是标准仓库.git目录里的内容,没有工作空间。 这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作(如:push、commit操作)。但是,你依旧可以使用git show命令查看提交内容。
git init --bare 初始化的目录等同于一个.git目录的内容。这样就比较好理解git的本质:本地仓库的.git和服务器仓库。它们是一回事情。
git init --bare 使用场景
如何设置一个远程共享库并进行团队协作
参考URL: https://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-push/
git裸仓库到底是怎么样的——实践出真知
参考URL: https://blog.csdn.net/q221520amlls/article/details/119325744
在本文中我将:
使用“普通库”代指用"git init"命令创建的git库;
使用“裸库”代指用"git init --bare"命令创建的git库;
裸仓库适用于远程仓库,裸仓库可以直接作为服务器仓库供各开发者push、pull数据,实现数据共享和同步,不保存文件,只保存历史提交的版本信息。
一般来说,一个裸库往往被创建用于作为大家一起工作的共享库,每一个人都可以往里面push自己的本地修改。裸仓库一个惯用的命名方式是在库名后加上.git。
裸仓库的目录名一般以.git 结尾,这也是为什么我们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的原因。
举个例子:初始化裸仓库,用于做为git服务端共享仓库
1) 初始化裸仓库
git init --bare <repo>
这个命令执行后,将在本地创建一个名为 repo 的文件夹, 里面包含着 Git 的基本目录, 我们一般会将这个文件夹命名为后面加 .git 的形式,如 repo.git (这也是为什么我们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的原因)。效果如下
root@sheservice:~# git init --bare repo.git
Initialized empty Git repository in /root/repo.git/
root@sheservice:~# cd repo.git/
root@sheservice:~# tree -a repo.git
repo.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
9 directories, 16 files
root@sheservice:~#
裸仓库, 并不包含 工作区 , 也就是说,我们并不能在这个目录下执行我们一般使用的 Git 命令。
除了 初始化一个空的裸仓库,还有一个思路就是把现有仓库导出为裸仓库 — 即一个不包含当前工作目录的仓库。做法直截了当,克隆时用 --bare 选项即可。
git clone --bare my_project my_project.git
现在 my_project.git 目录中已经有了一份 Git 目录数据的副本。
2)把裸仓库移到服务器上
有了裸仓库的副本后,剩下的就是把它放到服务器上并设定相关协议。假设一个域名为 git.example.com 的服务器已经架设好,并可以通过 SSH 访问,我们打算把所有 Git 仓库储存在/opt/git 目录下。只要把裸仓库复制过去
$ scp -r my_project.git [email protected]:/opt/git
现在,所有对该服务器有 SSH 访问权限,并可读取 /opt/git 目录的用户都可以用下面的命令克隆该项目:
$ git clone [email protected]:/opt/git/my_project.git
如果某个 SSH 用户对 /opt/git/my_project.git 目录有写权限,那他就有推送权限。如果到该项目目录中运行 git init 命令,并加上 --shared 选项,那么 Git 会自动修改该仓库目录的组权限为可写(译注:实际上 --shared 可以指定其他行为,只是默认为将组权限改为可写并执行 g+sx,所以最后会得到 rws。)。
$ ssh [email protected]
$ cd /opt/git/my_project.git
$ git init --bare --shared
由此可见,根据现有的 Git 仓库创建一个裸仓库,然后把它放上你和同事都有 SSH 访问权的服务器是多么容易。现在已经可以开始在同一项目上密切合作了。
总结:
git init使用于本地进行项目部署和搭建,git init --bare使用于服务器上,多版本协同管理。
一般来讲,作为远端备份或公共版本库时,应该使用git init --bare。你要是想建立一个固定的地址让大家一起用,就在服务器上用–bare。
版权归原作者 西京刀客 所有, 如有侵权,请联系我们删除。