初始化仓库git init和git init --bare的区别和使用场景

来源:csdn博客 分类: 文章浏览史 发布时间:2023-03-24 12:07:49 最后更新:2023-03-24 浏览:235
转载声明:
本文为摘录自“csdn博客”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2023-03-24 12:07:49

初始化仓库git init和git init --bare的区别

我们搭建好一个Git服务器后,在初始化仓库,往往使用git initgit 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 user@git.example.com:/opt/git

现在,所有对该服务器有 SSH 访问权限,并可读取 /opt/git 目录的用户都可以用下面的命令克隆该项目:

$ git clone user@git.example.com:/opt/git/my_project.git

如果某个 SSH 用户对 /opt/git/my_project.git 目录有写权限,那他就有推送权限。如果到该项目目录中运行 git init 命令,并加上 --shared 选项,那么 Git 会自动修改该仓库目录的组权限为可写(译注:实际上 --shared 可以指定其他行为,只是默认为将组权限改为可写并执行 g+sx,所以最后会得到 rws。)。

$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared

由此可见,根据现有的 Git 仓库创建一个裸仓库,然后把它放上你和同事都有 SSH 访问权的服务器是多么容易。现在已经可以开始在同一项目上密切合作了。

总结:
git init使用于本地进行项目部署和搭建,git init --bare使用于服务器上,多版本协同管理。
一般来讲,作为远端备份或公共版本库时,应该使用git init --bare。你要是想建立一个固定的地址让大家一起用,就在服务器上用–bare。

php技术微信