搭建环境与依赖安装
在开始搭建 Git 服务器之前,需要确保系统环境满足要求,并安装必要的依赖软件,以 Ubuntu/Debian 系统为例,首先更新系统软件包列表:

sudo apt update && sudo apt upgrade -y
接着安装 Git 和必要的工具(如 SSH 服务,用于远程安全连接):
sudo apt install git openssh-server openssh-client -y
安装完成后,检查 Git 版本以确保安装成功:
git --version
建议创建一个专门用于 Git 服务的系统用户(如 gituser),避免直接使用 root 用户操作,提升安全性:
sudo adduser gituser
根据提示设置密码,并将该用户添加到 sudo 组(可选,便于后续管理):
sudo usermod -aG sudo gituser
创建 Git 仓库与初始化
为 Git 服务器创建一个专门的目录用于存放仓库,并设置合适的权限,在 /home/gituser 目录下创建 repositories 文件夹:
sudo mkdir -p /home/gituser/repositories sudo chown -R gituser:gituser /home/gituser/repositories sudo chmod -R 755 /home/gituser/repositories
进入该目录,创建一个裸仓库(Bare Repository),裸仓库没有工作目录,仅包含版本历史信息,适合作为服务器端仓库:
cd /home/gituser/repositories git init --bare --shared project.git
--bare表示创建裸仓库;--shared允许多个用户访问仓库(可根据需求调整权限)。
创建完成后,仓库目录结构如下:
/home/gituser/repositories/project.git/
├── branches/
├── config
├── description
├── HEAD
├── hooks/
├── info/
├── objects/
└── refs/
配置 SSH 访问与用户权限
Git 服务器支持多种协议(如 HTTPS、SSH、Git),SSH 协议因安全性高且配置简单,是最常用的选择,以下是 SSH 访问的配置步骤:
生成 SSH 密钥(客户端操作)
在客户端机器上,生成 SSH 密钥对(如果尚未生成):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
按提示保存密钥(默认路径为 ~/.ssh/id_rsa),并将公钥(~/.ssh/id_rsa.pub)发送给服务器管理员。
部署公钥到服务器
在服务器端,为每个用户创建 ~/.ssh 目录和 authorized_keys 文件(用于存储客户端公钥):
sudo -u gituser mkdir -p /home/gituser/.ssh sudo -u gituser touch /home/gituser/.ssh/authorized_keys sudo chmod 700 /home/gituser/.ssh sudo chmod 600 /home/gituser/.ssh/authorized_keys
将客户端的公钥内容追加到 authorized_keys 文件中:
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..." >> /home/gituser/.ssh/authorized_keys
测试 SSH 连接
在客户端终端中,通过以下命令测试是否可以免密连接到服务器:

ssh gituser@your_server_ip
如果成功登录,说明 SSH 配置正确,退出登录后,即可通过 SSH 推送/拉取代码。
配置 Git 仓库的钩子(可选)
Git 钩子(Hooks)是仓库中特定事件触发时自动执行的脚本,可用于实现自动化流程(如代码提交检查、邮件通知等),以下以 pre-receive 钩子为例,演示如何禁止空提交:
-
进入仓库的
hooks目录:cd /home/gituser/repositories/project.git/hooks
-
创建
pre-receive文件:sudo nano pre-receive
-
添加以下内容(禁止空提交):
#!/bin/sh zero_commit="0000000000000000000000000000000000000000" while read oldrev newrev refname; do if [ "$newrev" = "$zero_commit" ]; then echo "Error: Cannot delete branch or tag" exit 1 fi if [ -z "$(git cat-file -t "$newrev" 2>/dev/null)" ]; then echo "Error: Invalid commit object" exit 1 fi done exit 0 -
为钩子文件添加执行权限:
sudo chmod +x pre-receive
其他常用钩子还包括 post-receive(推送后触发)、pre-commit(提交前触发)等,可根据需求定制。
安全加固与最佳实践
搭建 Git 服务器时,安全性至关重要,以下是几项关键的安全加固措施:
限制 Shell 访问
为 gituser 设置一个受限的 Shell(如 git-shell),防止其通过 SSH 登录服务器执行非 Git 操作:
sudo which git-shell # 确认 git-shell 路径(通常为 /usr/bin/git-shell) sudo usermod -s /usr/bin/git-shell gituser
设置后,用户只能通过 SSH 执行 Git 相关命令(如 git push、git pull),无法登录 Shell。
禁用密码认证
结合 SSH 密钥认证,可禁用密码登录,提升安全性,编辑 SSH 配置文件 /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
找到以下行并修改:
PasswordAuthentication no
PubkeyAuthentication yes
重启 SSH 服务使配置生效:

sudo systemctl restart sshd
定期备份仓库
Git 仓库是项目的核心资产,需定期备份,可通过 rsync 或 tar 命令备份仓库目录:
# 示例:每日备份到 /backup 目录 sudo tar -czf /backup/git-repositories-$(date +%Y%m%d).tar.gz /home/gituser/repositories
使用防火墙限制访问
通过 ufw(Uncomplicated Firewall)限制仅允许特定 IP 访问 SSH 服务:
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp # 允许特定 IP sudo ufw enable # 启用防火墙
客户端连接与使用
完成服务器配置后,客户端可通过以下步骤连接并使用 Git 仓库:
-
克隆仓库到本地:
git clone gituser@your_server_ip:/home/gituser/repositories/project.git
-
进入项目目录,创建新文件并提交:
cd project echo "# Hello Git Server" > README.md git add README.md git commit -m "Initial commit"
-
推送代码到服务器:
git push origin master
如果配置正确,代码将成功推送到服务器仓库,其他用户可通过 git clone 获取最新代码。
总结与扩展
通过以上步骤,已成功搭建了一个基于 Linux 和 Git 的私有代码托管服务器,该方案具备安全性高、配置灵活、成本低廉等优点,适合中小型团队或个人开发者使用。
如果需要更高级的功能(如 Web 界面、权限管理、持续集成等),可进一步扩展:
- Web 界面:集成 GitWeb 或 Gogs,提供仓库浏览、在线代码编辑等功能;
- 权限管理:使用 Gitolite 或 GitLab,实现细粒度的分支/标签权限控制;
- 持续集成:结合 Jenkins 或 GitHub Actions,自动化构建、测试和部署流程。
根据实际需求选择合适的扩展方案,可让 Git 服务器更贴合团队的开发流程,提升协作效率。



















