如何搭建自己的git服务器?

68 阅读6分钟

最近一直在寻找git产品,从最初的github,切换成gitee,码云等等,但当项目文件达到10G的时候,总会被收费,一年三五千元。没办法,时候搭建你一个自己的git服务器了。用了1天时间,搭建完成。

针对CentOS系统,以下是最简版Git服务端搭建步骤(单用户、无权限控制),全程仅需几条核心命令:

一、服务端操作

第一步:安装Git(CentOS通用)

# 1. 安装Git(自动解决依赖)
sudo yum install git -y

# 2. 验证安装(出现版本号即成功)
git --version

第二步:创建git用户+初始化裸仓库

# 1. 创建git用户(设置密码,记好!)
sudo useradd -m git  # 创建用户并自动生成/home/git目录
sudo passwd git      # 按提示输入git用户的密码(如123456,测试用)

# 2. 切换到git用户,创建仓库目录并初始化
sudo su - git        # 切换到git用户
mkdir -p /home/git/repositories  # 创建仓库存放目录
cd /home/git/repositories
git init --bare myrepo.git       # 初始化裸仓库(核心命令)
exit  # 退出git用户

第三步:客户端测试访问(克隆/推送)

客户端打开终端,执行:

# 克隆仓库(替换为你的服务器IP)
git clone git@你的服务器IP:/home/git/repositories/myrepo.git

# 推送测试(客户端本地操作)
cd myrepo
echo "test" > README.md
git add README.md
git commit -m "first commit"
git push origin master  # 按提示输入git用户的密码即可推送

核心简化点

  • 跳过复杂权限配置,仅用git用户的账号密码认证;
  • 无需额外工具(如gitolite),纯原生Git命令完成;
  • 全程不到10条命令,适合快速搭建个人Git服务。

如果想免密推送(不用每次输密码),只需补充:

# 客户端生成SSH密钥(回车到底)
ssh-keygen -t rsa
# 将客户端~/.ssh/id_rsa.pub内容复制到服务器
sudo su - git
mkdir -p /home/git/.ssh
echo "客户端公钥内容" > /home/git/.ssh/authorized_keys
chmod 600 /home/git/.ssh/authorized_keys

二. 生成网页

我想在前端显示出git中的文件列表,如何操作?

核心思路

  1. 后端:用脚本(Python)调用Git命令,获取仓库的文件列表;
  2. 前端:通过网页请求后端接口,拿到文件列表后渲染成HTML列表;
  3. 部署:把后端服务和前端页面部署到CentOS服务器上。

步骤1:准备环境(CentOS服务器)

安装Python、Flask(后端框架)和Git(已装可跳过):

# 安装Python和pip
yum install -y python3 python3-pip

# 安装Flask
pip3 install flask

步骤2:编写后端脚本(读取Git仓库文件)

在服务器上创建一个目录(比如/opt/git-web),新建app.py(后端代码):

from flask import Flask, render_template_string
import subprocess
import os

app = Flask(__name__)

# 配置Git仓库路径(替换为你的裸仓库路径)
GIT_REPO_PATH = "/home/git/repositories/myrepo.git"
# 临时目录(用于克隆仓库读取文件)
TEMP_CLONE_DIR = "/tmp/git_repo_temp"

def get_git_files():
    # 1. 先删除旧的临时目录(无论是否存在)
    if os.path.exists(TEMP_CLONE_DIR):
        subprocess.run(["rm", "-rf", TEMP_CLONE_DIR], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    # 2. 重新克隆裸仓库到临时目录
    subprocess.run([
        "git", "clone", GIT_REPO_PATH, TEMP_CLONE_DIR
    ], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    # 3. 遍历临时目录,获取文件列表(和之前一致)
    file_list = []
    for root, dirs, files in os.walk(TEMP_CLONE_DIR):
        if ".git" in dirs:
            dirs.remove(".git")
        relative_root = os.path.relpath(root, TEMP_CLONE_DIR)
        for file in files:
            file_path = os.path.join(relative_root, file)
            file_list.append(file_path)

    return file_list

# 关键修正:添加 @ 装饰器
@app.route("/")
def show_files():
    try:
        files = get_git_files()
        # 前端HTML模板(渲染文件列表)
        html = """
        <!DOCTYPE html>
        <html>
        <head>
            <title>Git仓库文件列表</title>
            <style>
                ul { list-style: none; padding: 0; }
                li { padding: 8px; border-bottom: 1px solid #eee; }
                li:hover { background: #f5f5f5; }
            </style>
        </head>
        <body>
            <h1>Git仓库上传文件列表</h1>
            <ul>
                {% for file in files %}
                    <li>{{ file }}</li>
                {% endfor %}
            </ul>
        </body>
        </html>
        """
        return render_template_string(html, files=files)
    except Exception as e:
        return f"读取失败:{str(e)}"


if __name__ == "__main__":
    # 允许外部访问(绑定服务器IP,端口8090)
    app.run(host="0.0.0.0", port=8090, debug=True)

步骤3:配置权限(关键!)

因为后端脚本需要访问git用户的仓库目录,要给运行Flask的用户(比如root)权限:

# 给仓库目录添加其他用户的读权限
chmod -R o+r /home/git/repositories/myrepo.git
# 确保临时目录可读写
chmod 777 /tmp

步骤4:启动服务并访问

  1. 启动Flask后端:
    cd /opt/git-web
    nohup python3 app.py > flask.log 2>&1 &
    
  2. 开放服务器8090端口(CentOS防火墙):
    firewall-cmd --permanent --add-port=8090/tcp
    firewall-cmd --reload
    
  3. 浏览器访问:http://你的服务器IP:8090,就能看到Git仓库的文件列表了。

三、客户端设置密钥登陆

客户端每次提交文件,都需要输入密码,如何能不输入密码呢?

以下是SSH密钥认证的完整具体步骤(从客户端生成密钥到服务器配置,确保能免密连接Git服务器):

步骤1:客户端(本地电脑)生成SSH密钥

打开本地的Git Bash(或终端),执行以下命令:

# 生成RSA密钥对(一路按回车键,不要设置密码,直接回车即可)
ssh-keygen -t rsa -C "jasonlee123man@126.com"

执行后,本地会在 ~/.ssh/ 目录下生成两个文件:

  • id_rsa:私钥(保存在本地,不要泄露);
  • id_rsa.pub:公钥(需要上传到服务器)。

步骤2:将客户端公钥上传到服务器的git用户目录

在本地Git Bash中,执行以下命令(替换152.136.57.19为你的服务器IP):

# 将本地公钥上传到服务器git用户的.ssh目录,并重命名为authorized_keys
scp ~/.ssh/id_rsa.pub git@152.136.57.19:/home/git/.ssh/authorized_keys

执行后会提示输入git用户的密码(输入你之前设置的git用户密码),输入后回车即可完成上传。

步骤3:服务器端配置ssh权限(关键,避免权限错误)

登录到你的CentOS服务器(比如通过腾讯云控制台的VNC或本地SSH),执行以下命令:

# 切换到git用户
su - git

# 确保.ssh目录存在,若不存在则创建
mkdir -p ~/.ssh

# 设置.ssh目录和文件的权限(必须严格设置,否则SSH密钥认证会失败)
chmod 700 ~/.ssh          # .ssh目录权限设为700(仅当前用户可读写执行)
chmod 600 ~/.ssh/authorized_keys  # 公钥文件权限设为600(仅当前用户可读写)

# 回到root用户(可选)
exit

步骤4:客户端测试SSH免密连接

在本地Git Bash中,执行以下命令测试是否能免密登录服务器的git用户:

ssh git@152.136.57.19

如果直接进入服务器的git用户命令行(无需输入密码),说明SSH密钥认证配置成功。

步骤5:客户端重新配置Git远程仓库地址(切换为SSH协议)

在本地仓库目录下,执行以下命令(替换仓库路径):

# 查看当前远程仓库地址(确认是否是http协议)
git remote -v

# 删除旧的远程地址(假设旧地址名为origin)
git remote remove origin

# 添加SSH协议的远程仓库地址(替换为你的服务器Git裸仓库路径)
git remote add origin git@152.136.57.19:/home/git/repositories/myrepo.git

步骤6:重新执行git push

在本地仓库目录下,执行推送命令:

git push origin master

此时会通过SSH密钥免密认证,直接完成推送(无密码输入提示),推送完成后会显示“100%”和“done”,代表上传成功。