Git私服的搭建记录

3/12/2023 git

# 前言

之前一直有想法搭建一个私服,当时主要看到普遍采取的解决方案是 Gitlab,然而启动该项目需要至少 4G 的内存,这对于服务器资源有限的人来说,十分不友好,并且 Gitlab 的管理功能基本是针对团队场景开发的,对于个人而言有些杀鸡牛刀了。

于是,便找到了另外一个方案,直接通过 Git 创建裸仓库(bare repo)。然后通过 SSH 的方式进行代码传输。该方案虽然简单,但是对于个人用户的小型服务器十分友好。

# 前提

  • 服务器一台

# 步骤

  1. 首先是在服务器安装 Git。主流 Linux 发行版基本都可以通过原生的包管理器获取,这里不过多介绍,下载安装之后通过 git --version 检查是否成功安装即可。

  2. 随后创建一个非 sudo 组的新用户专门用于存储 Git 远程仓库。这样会比较安全,即使你只是一个人使用,但万一呢,如果你实在不想创建,则可以直接到步骤 3。

# 创建 git 用户
sudo useradd git
# 给 git 用户设置一个密码
sudo passwd git
1
2
3
4
  1. 创建服务端的 Git bare repo。
# 切换到 git 用户
su git
# 进入到 git 的 home 目录
cd ~
# 创建一个文件夹用做仓库
mkdir repo_name.git
# 进入到该仓库
cd repo_name.git
# 初始化为裸仓库(只包含.git下的内容)
git init --bare
1
2
3
4
5
6
7
8
9
10

如果你需要将 bare repo 的默认分支切换为 main,可以使用 git symbolic-ref HEAD refs/heads/main。普通仓库类型设置默认分支比较简单,可以自行百度或者参考以下链接。

参考链接:Stack Overflow - How can I create a Git repository with the default branch name other than "master"? (opens new window)

  1. 通过以上命令,你已经成功创建了一个远程仓库!现在你需要让用户能够 SSH 到该用户,你需要完成以下操作:
# 本地创建 SSH 密钥,如果有可以跳过
ssh-keygen
# 拷贝本地的公钥,通常是在用户目录下的 .ssh/id_rsa.pub

# 复制该公钥到服务器的 git 用户的家目录下的 .ssh/authorized_keys 中
# 通常情况这个文件夹(.ssh)和文件(authorized_keys)是不存在的,需要你自己创建
1
2
3
4
5
6
  1. 在完成上述步骤后,你就已经完成了全部绝大部分工作了!现在分为两种情况。

    1. 第一种为你已经有一个本地仓库了,你只想 push 本地仓库到这个远程仓库,那么你只需要绑定远程仓库即可,例如 git remote add origin git@ip:repo_name.git
    2. 第二种情况就是你没有本地仓库,那么你仅仅只需要通过 git clone git@ip:repo_name.git 即可拷贝空项目至本地并建立本地仓库与远程仓库的关联了。

由于之前我们是直接将项目放在 git 用户的家目录下,因此这里没有涉及到相对路径,如果你的项目是在 git 用户目录下的子目录中,那么则可以改为 git 目录下的相对路径。例如仓库保存至服务端的 /home/git/repo/repo_name.git,那么上述的 clone 或者 remote 之后的路径就是 repo/repo_name.git

# 最后

稍微解释以下 bare repo。其实就是在普通仓库下的 .git 目录已经包含了 git 需要的全部信息,包括代码。这些信息会被压缩打包保存 .git 目录中,只不过没有项目结构那么直观。

因此对于服务端而言,保存为 bare repo,然后每次 push 至该仓库都只是重新生产 .git 目录下的文件并上传至服务端的 repo_name.git 目录中。

Enjoy the Git。