「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
作者:Mintimate
Mintimate's Blog,只为与你分享
仓库初始化
我们搭建好一个Git服务器后,在初始化仓库,往往使用git init或git init --bare来初始化项目。
但是,这两个的区别是什么呢?
Git init
通常,我们初始化本地仓库时,使用git init:建立一个标准的Git仓库。
这样的仓库初始化后,其项目目录为工作空间,其下的.git目录是版本控制器。
cd .git
ls -a
Git init --bare
通常,我们初始化远程服务器仓库时,使用git init --bare:建立一个“裸”的Git仓库:
这样的仓库初始化后,其项目目录下就是标准仓库.git目录里的内容,没有工作空间。
这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作(如:push、commit操作)。
但是,你依旧可以使用git show命令查看提交内容:
使用环境
相信看完上述描述,大家已经知道什么时候使用Git init,什么时候又使用Git init --bare了:
init:适用于本地仓库初始化,有完整的Git命令集,可以提交工作空间的代码和文件。init --bare::适用于远程仓库初始化,默认没有工作空间。
git init --bare适用于远程仓库;一方面,使用Git方便备份本地项目,另外一方面,没有工作空间,只提供版本管理的Git,更方便团队协作。
但是,如果你远程初始化的“裸”仓库,之后想看默认分支的工作空间具体项目文件怎么办?
很简单,配合git工具下的hook
裸仓库创建工作空间
“裸”仓库创建工作空间很简单,配合hook即可。
hook是什么?
Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。
简单地说,hook就是一些在Git特定动作时候,触发的事件/脚本任务。
具体可以查看:Git官方中文文档
post-receive
我们要在裸仓库内,看到用户提交的工作空间很简单。只需要编写post-receivehook即可:
# 当前在裸仓库内
cd hooks
# 创建并编辑post-receive
vim post-receive
输入内容:
#!/bin/sh
git --work-tree=#工作空间# --git-dir=#Git仓库地址# checkout -f
比如:
其中:
- 工作空间:服务器上空目录地址,git用户需要有读写权限;我这里设置到Nginx上的网站目录。
- Git仓库地址:服务器上本仓库地址。
之后,进行提取(赋予执行权限):
chmod +x post-receive
之后,用户push提交后,在外面定义的工作空间就可以看到用户提交的具体内容:
总结
git init使用于本地进行项目部署和搭建,git init --bare使用于服务器上,多版本协同管理。你可以使用hook来对服务器上内容进行进一步完善。