使用git在服务器上搭建远程仓库
2022-07-15 # Linux # git

此篇内容由hexo博客部署的前置内容,因此仅针对部署博客过程中的一些过程来记录,省略了安装git的过程。

本文中并为对git的基础操作和概念做过多的记录,需要先掌握git的本地操作以及push内容到github一类的远程仓库。

创建一个新用户(可选)

通常我们习惯于用不同的用户来分别管理不同的功能。因此可以采用一个新的用户来负责git的访问。

1
2
adduser git
passwd git

从功能上来看。git这一用户没有使用shell的需求。所以出于安全性的考虑。我们可以通过编辑/etc/passwd文件来禁止git用户登录shell,此处略过这一过程。建议如果有需要,可以在配置完成后再关闭。

初始化远程仓库

以下所有创建过程建议用git用户完成。若用root用户,则后续需要更改权限

例如我们想将/home/git/repo这一文件夹作为仓库(目录可随意选择,不一定要在git用户的家目录下,此处只是举例)。那么我们就需要在这一目录下执行下面的命令

1
git init --bare

关于–bare参数

–bare表示创建一个裸仓库(不太清楚是不是应该这么翻译)即没有工作树的仓库。

二者区别:

如果不想了解只要记住结论即可:

本地仓库使用git init,远端的共享仓库使用git init –bare

使用git init创建的仓库有工作区,我们在本地通常使用的是这种类型的仓库。可以进行版本回退,切换分支等等的操作。而 –bare创建的仓库没有工作区。

init直接创建的仓库

–bare创建的仓库

使用 ll -a 可以看到隐藏的目录和文件

通过观察二者目录里的内容,发现二者在内容上基本一致,只是直接用init创建的仓库。所有的git相关文件都被放入了一个隐藏的文件夹.git中。

虽然看起来差不多。但使用bare创建出的仓库可以更方便的使用hook。在初始化远程仓库时最好使用 git –bare init 而不要使用:git init。

如果一定要使用git init创建,则需注意下面两个问题

1.直接push到git init创建出的目录,可能会遇到failed to push some refs to的错误。

这是由于git默认拒绝了push操作,需要进行设置,修改.git/config文件后面添加如下内容:

1
2
[receive]
denyCurrentBranch = ignore

2.push的文件不会直接更改。而是会存到暂存区。每次push结束后需要从暂存区检出更新。解决方法可以参照这篇文章(关于hook后面会做介绍)

向远程仓库push内容

在本地git项目目录下执行下面的操作(本地已经存在commit过的分支)

1
git push 用户名@服务器ip:路径 分支名

例如:

1
git push git@192.168.1.103:/home/git/repo master

此时如果遇到此种报错

请查看git仓库目录的所有者是否为git用户。若用root用户执行了上面创建仓库的操作则会出现此种权限问题。可以尝试重新更换用户创建仓库。或直接更改仓库所有者。

clone操作也是同理

1
git clone git@182.92.200.149:/home/git/repo master

如果没有配置免密登录则需输入一次密码,配置方式可参考上一篇文章

至此,远端的git仓库就算是搭建完成了。

补充:关于git-hooks的配置

在部署博客时。每一次git push之后,我们都需要将服务器git仓库中部署的内容拷贝到nginx之类的web服务器的工作目录下,才能使网页正常更新。但手动拷贝的方式过于繁琐。因此我们可以采用hook(钩子)的方式,来自动的实现这一过程。

这里的hook是伴随性的事件。例如我习惯于在吃饭后洗碗。那么我就需要将洗碗这个事件加入到我吃饭后要做的事情的清单中,这样每次吃完饭。我都会按照清单上写的去洗碗。

在git仓库文件夹下,由一个hooks文件夹。里面存放了许多.sample的文件。这些便是git给我们的钩子的使用样例。我们可以参照着来写。其中post-receive即为收到文件后要执行的操作。因此我们可以在这一目录下,新建一个post-receive文件。

1
vim /var/repo/blog/hooks/post-receive

上述命令的git仓库位于/var/repo/blog中。

在文件中添加如下内容

1
2
#!/bin/bash
git --work-tree=要部署到的路径 --git-dir=仓库的路径 checkout -f

例如我们要将blog部署到var/www/hexo这个文件夹下

1
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog checkout -f

然后我们为这一文件添加执行权限

1
chmod +x /var/repo/blog/hooks/post-receive

若使用了root用户创建该git仓库。还需要更改仓库拥有者

1
chown -R git:git blog

再对应的创建相应的静态目录。并给予权限

1
2
3
mkdir /var/www/hexo
chown -R git:git /var/www/hexo
chmod -R 755 /var/www/hexo

之后便可以尝试git push了。在push之后,我们便可以在/var/www/hexo中看到我们push的内容了