ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在阿里云服务器搭建私有Git仓库:从SSH密钥到自动化部署全攻略

在阿里云服务器搭建私有Git仓库:从SSH密钥到自动化部署全攻略 1. 项目概述为什么要在云服务器上搭建自己的代码仓库最近在折腾一个个人项目代码文件散落在本地和几台不同的电脑上同步起来特别麻烦。用公共的Git服务吧有些私有代码又不想放上去。于是我就琢磨着能不能在自己买的阿里云服务器上搞一个私有的Git代码仓库这样一来代码完全自己掌控同步也方便还能顺便学习下服务器和Git的深度结合。这个想法听起来可能有点“硬核”但实际操作下来我发现只要理清步骤完全就是一套“傻瓜式”的流程根本不需要多高深的技术背景。简单来说这个过程就是在你的阿里云服务器上安装并配置Git创建一个裸仓库Bare Repository然后通过SSH密钥实现免密安全连接最后就能像使用GitHub或Gitee一样从本地电脑用git push和git pull来同步代码了。它完美解决了多设备代码同步、私有项目托管和轻量级团队协作的需求。无论你是独立开发者、学生还是小团队的技术负责人只要有一台云服务器不限于阿里云腾讯云、华为云等操作都类似都能跟着这篇教程一步步搭建起来。接下来我会把从服务器初始化到本地成功推送代码的每一个环节连同我踩过的坑和总结的技巧毫无保留地分享给你。2. 核心思路与准备工作理解“远程仓库”的本质在开始动手之前我们得先搞清楚我们要做什么。Git是一个分布式版本控制系统所谓“远程仓库”本质上就是一台你能通过网络比如SSH协议访问的计算机上的一个特殊目录。阿里云服务器对我们来说就是这台“远程计算机”。我们的目标是在这台服务器上创建一个Git能识别的仓库并配置好访问权限。2.1 你需要准备的东西一台阿里云服务器ECS或轻量应用服务器均可这是我们的“远程主机”。确保你已经购买了服务器并拥有它的公网IP地址、管理员账号通常是root和密码或SSH密钥。新购买的服务器建议先完成系统初始化如设置密码、安全组规则。一个本地开发环境你自己的Windows、Mac或Linux电脑上面需要安装好Git。如果还没安装去Git官网下载安装即可过程非常简单。一个SSH连接工具用于连接和管理你的云服务器。Windows用户推荐使用PuTTY或Xshell或者直接使用Windows 10/11自带的PowerShell或终端如果支持SSH。Mac和Linux用户直接使用系统自带的终端Terminal就行。2.2 关键概念提前知SSH密钥对与裸仓库这是两个容易让新手困惑的概念理解了它们后续操作会顺畅很多。SSH密钥对这是实现免密码、安全登录服务器的核心。它由一把“私钥”和一把“公钥”组成。私钥保存在你的本地电脑上必须严格保密就像你家门的唯一一把钥匙公钥则可以放心地放到服务器上相当于门锁。当本地通过SSH连接服务器时会用私钥去“匹配”服务器上的公钥匹配成功就允许登录无需输入密码。我们后面配置的就是这个。裸仓库Bare Repository服务器上存放的仓库类型。它和你在本地用git init创建的普通仓库不同裸仓库没有工作区即不包含实际的代码文件只保存Git的版本历史信息在.git目录里。你可以把它想象成一个纯粹的“版本数据库”只接受push和pull不能直接在里面修改文件。创建命令是git init --bare。3. 服务器端配置打造坚固的代码保险箱现在我们开始登录服务器进行配置。请打开你的SSH连接工具输入服务器的公网IP地址使用root账号和密码登录。3.1 第一步更新系统与安装Git登录后第一件事是确保系统软件包是最新的然后安装Git。这里以最常见的CentOS 7/8或Alibaba Cloud Linux系统为例。如果你用的是Ubuntu命令会稍有不同apt update apt install git -y。# 更新系统软件包列表 yum update -y # 安装Git yum install git -y安装完成后可以通过git --version命令来验证是否安装成功。这个步骤一般很顺利如果遇到网络问题导致安装慢或失败可以尝试更换yum源为阿里云镜像源。注意在生产环境中出于安全考虑不建议长期直接使用root用户操作。更好的做法是创建一个专门的普通用户如git来管理仓库。但为了教程的简洁和直观我们这里暂时使用root。如果你要创建专用用户记得在后续的目录权限和SSH配置上做相应调整。3.2 第二步创建Git用户与代码仓库目录虽然我们用root操作但最好为仓库创建一个独立的目录结构清晰。# 创建一个名为 git 的目录通常放在 /home 或 /var 下 mkdir -p /home/git # 进入该目录 cd /home/git # 为你具体的项目创建一个裸仓库这里以项目名 myproject.git 为例 # 约定俗成裸仓库的目录名以 .git 结尾 git init --bare myproject.git执行完最后一条命令你会看到类似Initialized empty Git repository in /home/git/myproject.git/的提示。这时/home/git/myproject.git目录就是你的远程裸仓库了。你可以用ls -la /home/git/myproject.git看看里面的结构主要是一些hooks、objects、refs等目录没有工作区文件。3.3 第三步配置SSH密钥认证免密登录的关键这是整个流程中最重要的一步配置好后本地推送代码就不再需要每次输入服务器密码了。首先在本地电脑生成SSH密钥对如果之前没有生成过。 打开你本地电脑的终端Windows用Git Bash或PowerShellMac/Linux用系统终端输入ssh-keygen -t rsa -b 4096 -C your_emailexample.com这里的-C后面是你的邮箱作为密钥的标识。执行命令后它会询问你密钥保存的路径直接按回车使用默认路径~/.ssh/id_rsa即可。接着会询问你是否为密钥设置密码passphrase为了方便可以直接回车留空但出于安全设置一个密码更佳。生成成功后在~/.ssh/目录下会得到两个文件id_rsa私钥保密和id_rsa.pub公钥。然后将本地公钥上传到服务器。 我们需要将id_rsa.pub的内容添加到服务器对应用户这里是root的授权文件里。在本地终端查看并复制你的公钥内容cat ~/.ssh/id_rsa.pub全选复制输出的那一长串以ssh-rsa AAA...开头的内容。回到服务器的SSH会话窗口执行以下命令# 确保 .ssh 目录存在 mkdir -p ~/.ssh # 将公钥内容写入 authorized_keys 文件 echo 你刚才复制的公钥内容 ~/.ssh/authorized_keys # 设置正确的权限这一步非常关键权限不对会导致认证失败 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys最后测试SSH免密登录。 在本地终端尝试用SSH连接服务器ssh root你的服务器公网IP如果配置正确你应该能直接登录到服务器而不再需要输入密码。如果提示需要密码请检查上述步骤尤其是文件权限和公钥内容是否正确复制。4. 本地项目操作连接远程仓库并推送代码服务器端仓库和访问通道都准备好了现在回到我们的本地电脑开始操作本地项目。4.1 第一步初始化本地仓库或关联现有项目情况A你有一个全新的本地目录想初始化为Git仓库并推送到服务器。# 进入你的项目目录 cd /path/to/your/local/project # 初始化本地Git仓库 git init # 添加所有文件到暂存区 git add . # 提交第一次更改 git commit -m Initial commit情况B你本地已经是一个Git仓库比如从别处克隆的。直接进行下一步即可。4.2 第二步添加远程仓库地址这是连接本地和远程服务器的桥梁。我们需要告诉本地Git远程仓库在哪里。# 添加一个远程仓库并命名为 origin这是惯用名可以自定义 git remote add origin ssh://root你的服务器公网IP:/home/git/myproject.git这里解释一下这个地址ssh://表示使用SSH协议。root是登录服务器的用户名。你的服务器公网IP是服务器的地址。:/home/git/myproject.git是服务器上裸仓库的绝对路径。你可以用git remote -v命令来查看已配置的远程仓库地址。实操心得第一次使用SSH地址时连接会提示你是否信任服务器的指纹RSA key fingerprint输入yes即可。这会将服务器信息加入本地的known_hosts文件以后就不会再提示了。4.3 第三步推送代码到远程仓库现在激动人心的时刻到了把本地代码推送到你自己的服务器上。# 如果是第一次推送需要指定上游分支 git push -u origin main如果你的本地默认分支是master则将main替换为master。-u参数会将本地的main分支与远程的origin/main分支关联起来下次直接git push即可。推送成功后终端会显示类似* [new branch] main - main的信息。此时你的代码已经安全地躺在阿里云服务器的仓库里了。4.4 第四步从其他电脑克隆或拉取代码当你在另一台电脑上想继续开发时只需要克隆这个远程仓库即可。前提是这台电脑的SSH公钥也已经添加到了服务器的authorized_keys文件中。git clone ssh://root你的服务器公网IP:/home/git/myproject.git克隆完成后你就拥有了完整的项目历史和文件可以开始开发了。开发完成后git push就能同步回服务器。5. 进阶配置与优化让使用更顺手基础功能已经实现但为了让这个私有仓库更好用、更安全我们还可以做一些优化。5.1 使用非root用户和权限管理长期使用root不安全。我们可以创建一个名为git的专用系统用户来管理所有仓库。# 在服务器上操作 # 1. 添加git用户 adduser git # 2. 切换到git用户 su - git # 3. 在git用户的家目录创建仓库 mkdir -p ~/repositories cd ~/repositories git init --bare myproject.git # 4. 将本地电脑的公钥添加到 git 用户的 ~/.ssh/authorized_keys 中 # 注意需要先 su - git然后像之前root用户一样操作 .ssh 目录和文件之后本地远程仓库地址就变为ssh://git你的服务器公网IP:/home/git/repositories/myproject.git。这样更专业也更安全。5.2 配置Git钩子Hooks实现自动化Git钩子是仓库特定事件发生时自动运行的脚本存放在仓库的hooks目录下。一个非常实用的钩子是post-receive它可以在代码被推送到裸仓库后自动触发。例如我们可以实现自动部署当代码推送到服务器的production分支时自动将代码检出到Web服务器的目录如/var/www/html。在服务器上进入裸仓库的hooks目录cd /home/git/myproject.git/hooks创建post-receive文件并编辑cat post-receive EOF #!/bin/bash TARGET/var/www/html/myproject GIT_DIR/home/git/myproject.git BRANCHproduction while read oldrev newrev refname do if [[ $refname refs/heads/$BRANCH ]]; then echo Deploying $BRANCH branch to $TARGET... git --work-tree$TARGET --git-dir$GIT_DIR checkout -f $BRANCH # 这里可以添加更多部署后命令如重启服务、安装依赖等 # cd $TARGET npm install --production echo Deployment completed. fi done EOF给脚本添加执行权限chmod x post-receive这样每次你向服务器的production分支推送代码时Web目录下的文件就会自动更新。注意执行脚本的用户如git需要对目标目录/var/www/html/myproject有写权限。6. 常见问题与故障排查实录在实际操作中你可能会遇到下面这些问题。别慌大部分都有明确的解决办法。6.1 SSH连接失败或仍需密码这是最常见的问题。症状执行git push或ssh连接时依然提示输入密码或直接Permission denied。排查步骤检查公钥是否复制完整确保服务器上~/.ssh/authorized_keys文件中的公钥内容是一整行没有换行或空格。检查文件权限这是高频坑点务必确保服务器上.ssh目录权限为700(drwx------)authorized_keys文件权限为600(-rw-------)这些文件的所有者必须是当前用户如root或git。检查SELinux仅限CentOS/RHEL系列SELinux可能会阻止SSH读取密钥文件。可以临时禁用测试setenforce 0。如果问题解决则需要配置SELinux策略或永久关闭不推荐生产环境。使用详细模式调试在本地执行ssh -v root服务器IP查看详细的连接过程日志通常能定位到问题环节。6.2 Git推送失败拒绝更新非快进式引用症状git push时提示! [rejected] main - main (non-fast-forward)。原因远程仓库的提交历史和你本地的不一致通常是因为别人推送了新的提交或者你直接在服务器仓库做了修改。解决强制推送慎用git push -f origin main。这会用你的本地历史覆盖远程历史如果远程有重要提交会被抹掉仅限你确认可以丢失远程更改时使用。先拉取再合并这是推荐做法。先执行git pull origin main将远程更改拉取到本地并合并可能会解决冲突然后再执行git push origin main。6.3 克隆或拉取速度慢症状git clone或git pull时速度非常慢。原因服务器带宽小或者你的网络到服务器机房线路不佳。解决对于小带宽服务器如1Mbps这是正常现象。可以考虑升级服务器带宽。检查服务器是否有安全组或防火墙规则限制了你的IP或端口SSH默认22端口。如果代码库很大可以考虑在服务器端使用git gc命令优化仓库清理无用对象。6.4 错误提示fatal: not a git repository症状在某个目录下执行git命令时提示fatal: not a git repository (or any of the parent directories): .git。原因你当前所在的目录不是一个Git仓库没有.git文件夹。解决确保你在正确的项目目录下。如果你要初始化新仓库先执行git init。如果你要克隆先cd到一个合适的目录再执行git clone。6.5 如何迁移或备份整个仓库非常简单。因为服务器上的裸仓库就是一个完整的目录。备份直接打包整个myproject.git目录即可tar -czf myproject.git.backup.tar.gz /home/git/myproject.git。迁移到新服务器在新服务器上重复“服务器端配置”步骤创建好Git用户、目录和SSH公钥。将备份的myproject.git.backup.tar.gz上传到新服务器解压到对应的仓库目录如/home/git/。本地电脑更新远程仓库地址git remote set-url origin ssh://git新服务器IP:/home/git/myproject.git。执行一次git push测试连接。整个过程走下来你会发现搭建一个私有的Git服务器并没有想象中复杂。它给了你完全的自主权和隐私性对于管理个人项目、小团队内部代码来说是一个非常经济且高效的方案。最关键的是通过亲手搭建你对Git和服务器协同工作的理解会深刻得多。以后再遇到任何版本管理或部署问题你都能更从容地应对和排查。
返回列表