在团队协作和代码版本控制中,搭建一个私有的 Git 服务器是许多企业和开发者的选择,它能提供更高的安全性、完全的控制权以及与内部系统的无缝集成,本文将详细介绍如何在 CentOS 系统上,通过 SSH 协议搭建一个稳定、安全的 Git 服务器。
环境准备
在开始之前,请确保您拥有一台安装了 CentOS(推荐 7 或 8 版本)的服务器,并拥有 sudo
权限,所有操作都将通过命令行完成。
更新系统软件包到最新版本,这是一个良好的运维习惯。
sudo yum update -y
安装 Git 服务所需的核心软件——Git。
sudo yum install -y git
安装完成后,可以通过 git --version
命令来验证 Git 是否已成功安装。
创建专用 Git 用户
为了安全起见,我们不应该直接使用 root
用户或其他普通用户来管理 Git 仓库,创建一个专用的 git
用户,可以隔离权限,降低安全风险。
创建用户
sudo adduser git
为用户设置密码(此密码主要用于服务器端管理,客户端推荐使用 SSH 密钥登录)
sudo passwd git
系统会提示您输入并确认新密码。
初始化裸仓库
Git 仓库分为两种:普通仓库和裸仓库,普通仓库包含我们日常开发时看到的源代码文件和 .git
目录,而裸仓库只包含 Git 版本历史的核心数据,没有工作目录,它不用于直接编辑文件,而是作为共享的“中央仓库”,供多个用户推送和拉取代码。
仓库类型 | 用途 | 目录结构 |
---|---|---|
普通仓库 | 开发者的工作区 | 包含项目文件和 .git 目录 |
裸仓库 | 远程中央仓库 | 只包含 .git 目录下的内容,无项目文件 |
我们切换到 git
用户,并创建一个裸仓库。
# 切换到 git 用户 su - git # 创建一个用于存放所有仓库的目录 mkdir -p /home/git/repositories # 进入该目录 cd /home/git/repositories # 初始化一个名为 my-project.git 的裸仓库 git init --bare my-project.git
执行完毕后,/home/git/repositories/my-project.git
目录就创建好了,它就是我们的第一个远程 Git 仓库。
配置 SSH 密钥认证
使用密码进行 Git 操作既不安全也不方便,标准的做法是使用 SSH 密钥对进行认证。
在服务器端准备
我们需要在
git
用户的主目录下创建一个.ssh
目录,用于存放客户端的公钥。# 确保当前是 git 用户 # 创建 .ssh 目录 mkdir /home/git/.ssh # 设置正确的权限,这是 SSH 安全要求的关键一步 chmod 700 /home/git/.ssh # 创建 authorized_keys 文件,用于存储所有被授权的客户端公钥 touch /home/git/.ssh/authorized_keys # 设置文件权限,同样重要 chmod 600 /home/git/.ssh/authorized_keys
在客户端操作
在每个需要访问 Git 服务器的开发者的电脑上(假设是 Linux 或 macOS),生成 SSH 密钥对(如果还没有的话)。
ssh-keygen -t rsa -C "your_email@example.com"
一路回车即可,这会在用户主目录的
.ssh
文件夹下生成id_rsa
(私钥)和id_rsa.pub
(公钥)两个文件。将客户端的公钥(
id_rsa.pub
文件的内容)添加到服务器的/home/git/.ssh/authorized_keys
文件中,您可以使用ssh-copy-id
命令(如果客户端支持),或者手动复制。手动复制方法:
在客户端电脑上,查看并复制公钥内容:cat ~/.ssh/id_rsa.pub
登录到 CentOS 服务器,切换到
git
用户,将复制的内容粘贴到authorized_keys
文件的末尾。su - git echo "paste_the_public_key_content_here" >> /home/git/.ssh/authorized_keys
每个需要访问的客户端都需要将其公钥添加到这个文件中。
客户端克隆与测试
至此,Git 服务器已搭建完成,现在可以在客户端上进行测试。
克隆仓库
将
your_server_ip
替换为您的 CentOS 服务器 IP 地址。git clone git@your_server_ip:/home/git/repositories/my-project.git
如果一切正常,您会看到克隆成功的提示,并本地出现一个
my-project
文件夹。进行 Git 操作
进入项目目录,创建一个文件,然后进行提交和推送,以测试写入权限。
cd my-project echo "Hello, Git Server!" > README.md git add README.md git commit -m "Initial commit" git push origin main
注意:初始分支名可能是
master
,取决于您的 Git 客户端版本和配置,请使用git branch
查看。如果推送没有报错,恭喜您,您的 CentOS Git 服务器已经完全正常工作了!
相关问答FAQs
问题 1:我忘记了 Git 用户的密码,或者想禁用密码登录,只允许密钥登录,怎么办?
解答: 如果忘记密码,可以使用 root
用户执行 sudo passwd git
来重置,为了提升安全性,强烈建议禁用 git
用户的密码登录,强制使用 SSH 密钥,编辑 SSH 的配置文件 sudo vi /etc/ssh/sshd_config
,找到 PasswordAuthentication
这一行,将其值改为 no
(如果被注释了,去掉开头的 ),保存退出,然后重启 SSH 服务使配置生效:sudo systemctl restart sshd
,这样,任何试图通过密码登录 git
用户的操作都会被拒绝。
问题 2:我如何为不同的仓库设置不同的用户权限?比如A用户可以读写 project-a,但只能读取 project-b。
解答: 使用上文介绍的 authorized_keys
方法,所有授权用户对 git
用户主目录下的所有仓库都拥有相同的读写权限(基于文件系统的权限),要实现精细化的、按仓库的权限控制,仅靠 authorized_keys
会非常复杂,推荐使用 Gitosis 或更现代的 Gitolite 这类工具,Gitolite 通过一个特殊的 Git 仓库来管理所有权限配置,您只需在一个配置文件中定义用户、仓库和访问规则(如 RW+
, R
),然后推送这个配置仓库,Gitolite 就会自动更新服务器上的 authorized_keys
和仓库权限,极大地简化了多用户、多仓库的权限管理工作。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复