最近一直在寻找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中的文件列表,如何操作?
核心思路
- 后端:用脚本(Python)调用Git命令,获取仓库的文件列表;
- 前端:通过网页请求后端接口,拿到文件列表后渲染成HTML列表;
- 部署:把后端服务和前端页面部署到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:启动服务并访问
- 启动Flask后端:
cd /opt/git-web nohup python3 app.py > flask.log 2>&1 & - 开放服务器8090端口(CentOS防火墙):
firewall-cmd --permanent --add-port=8090/tcp firewall-cmd --reload - 浏览器访问:
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”,代表上传成功。