从零开始:在自有服务器上搭建一套完整的Git代码部署工作流

60 24~31 分钟

核心概念

这个流程的关键是区分两种类型的Git仓库:

  1. 裸仓库 (Bare Repository): 你的 codesyncA 就是裸仓库。它没有工作目录(即你看不到项目文件),只包含Git的版本历史和数据.git 目录里的内容)。它的唯一作用就是作为远程端点,接收和发送 push 和 pull 请求。通常以 .git 结尾,例如 codesyncA.git。

  2. 工作仓库 (Working Repository): 你的 A 目录和本地开发目录都是工作仓库。它包含完整的项目文件,你可以在这里修改代码、编译和运行服务。

第一部分:服务器端配置

这一步是在你的服务器上创建两个仓库,并建立它们之间的联系。

步骤 1.1:创建裸仓库 codesyncA.git

这个仓库将作为你本地电脑 push 的目的地。

  1. SSH登录到你的服务器:

     ​
     ssh your_user@your_server_ip
     ​
  2. 进入家目录,并创建一个裸仓库。我们按照惯例,给它加上 .git 后缀。

     ​
     cd ~
     ​
     git init --bare codesyncA.git
     ​

    执行后,你会看到一个提示 Initialized empty Git repository in /home/your_user/codesyncA.git/。这个 codesyncA.git 目录就是你的私有Git远程仓库。

步骤 1.2:创建工作仓库 A

这个仓库用来实际运行你的服务。它是从我们刚创建的裸仓库克隆出来的。

  1. 确保你仍然在家目录下 cd ~

  2. 从本地的裸仓库克隆出工作仓库 A:

     git clone ~/codesyncA.git A

    这个命令会自动完成几件事:

    • 创建一个名为 A 的目录。

    • A 目录本身就是一个Git仓库。

    • 它的默认远程地址 origin 会自动指向 ~/codesyncA.git。你可以进入 A 目录,用 git remote -v 命令来验证。

至此,服务器端的配置已经完成~/codesyncA.git 是中央仓库,~/A 是工作目录。


第二部分:本地开发机配置

现在配置你的本地电脑,让它能连接到服务器上的 codesyncA.git 仓库。

步骤 2.1:设置SSH免密登录

为了每次 push 代码时不用输入密码,配置SSH密钥对是最佳实践。

  1. 在本地电脑上,检查是否已有SSH密钥。如果 ~/.ssh/id_ed25519.pub 或 ~/.ssh/id_rsa.pub 文件存在,可以跳到第3步。

  2. 如果还没有,生成一个新的SSH密钥对(推荐使用Ed25519算法):

     ​
     ssh-keygen -t ed25519 -C "your_email@example.com"
     ​

    一路按回车使用默认设置即可。

  3. 将你的公钥复制到服务器。使用 ssh-copy-id 命令最简单:

     ​
     ssh-copy-id your_user@your_server_ip
     ​

    它会提示你输入一次服务器密码,然后自动完成所有配置。

  4. 测试免密登录。重新SSH登录服务器,如果直接登录成功没有提示输密码,就代表配置成功了。

     ​
     ssh your_user@your_server_ip
     ​

步骤 2.2:关联远程仓库

现在,在你本地的项目中,添加一个指向服务器裸仓库的远程地址。

情况A:你本地已经有一个项目了

  1. 进入你本地的项目目录:

     ​
     cd /path/to/your/local_project
     ​
  2. 添加一个新的远程地址。我们给它取个名字,比如 server 或者 prod,以和 origin (如果你的项目还关联了GitHub/GitLab) 区分开。

     ​
     # 格式:git remote add <远程名> <user>@<server_ip>:<裸仓库路径>
     ​
     git remote add server your_user@your_server_ip:~/codesyncA.git
     ​

    注意路径最后的 ~/codesyncA.git,这里的 ~ 会被服务器正确解析为家目录。

  3. 验证一下是否添加成功:

     git remote -v

    你应该能看到名为 server 的新远程地址。

情况B:你想从服务器上把项目全新克隆到本地

如果本地还没有项目,可以直接从服务器克隆,这样更简单:

 ​
 # 在本地电脑上执行
 ​
 # 格式:git clone <user>@<server_ip>:<裸仓库路径> <本地目录名>
 ​
 git clone your_user@your_server_ip:~/codesyncA.git my_awesome_project
 ​

这样克隆下来后,默认的远程名 origin 就直接指向你的服务器了。


第三部分:日常开发工作流

所有配置都已就绪,现在开始你的日常开发循环。

  1. 在本地开发:

    在你的本地项目目录里修改代码、新增功能...

  2. 提交并推送到服务器:

     ​
     # 添加所有改动到暂存区
     ​
     git add .
     ​
     # 提交改动
     ​
     git commit -m "feat: 完成了XX功能"
     ​
     # 推送到服务器的裸仓库(假设你的分支是 main)
     ​
     # 如果你之前添加的远程名是 server
     ​
     git push server main
     ​
  3. 登录服务器,更新服务:

     ​
     # 1. SSH 登录服务器
     ​
     ssh your_user@your_server_ip
     ​
     # 2. 进入服务A的运行目录
     ​
     cd ~/A
     ​
     # 3. 从裸仓库拉取刚刚推送的最新代码
     ​
     git pull
     ​

    因为 ~/A 是从 ~/codesyncA.git 克隆的git pull 默认就会从那里拉取。

  4. 重启服务:

    拉取完最新代码后,根据你的服务部署方式,执行重启命令。

     ​
     # 例如,如果你用 pm2
     ​
     pm2 restart serviceA
     ​
     # 或者如果你用 systemd
     ​
     # sudo systemctl restart serviceA.service
     ​
     # 或者其他任何你的启动方式
     ​

这个流程就完整地跑通了!

优化建议:自动化部署脚本

为了让第3和第4步更简单,你可以在服务器上写一个简单的部署脚本。

  1. 在服务器家目录下创建一个脚本,例如 deploy_A.sh:

     ​
     # 在服务器上执行
     ​
     nano ~/deploy_A.sh
     ​
  2. 写入以下内容:

     ​
     #!/bin/bash
     ​
     ​
     ​
     echo "=== 开始部署服务A ==="
     ​
     ​
     ​
     # 进入工作仓库目录
     ​
     cd /home/your_user/A
     ​
     ​
     ​
     # 拉取最新代码
     ​
     echo "--- 正在拉取最新代码 ---"
     ​
     git pull
     ​
     ​
     ​
     # 这里可以加上安装依赖、编译等步骤
     ​
     # echo "--- 正在安装依赖 ---"
     ​
     # npm install
     ​
     ​
     ​
     # 重启服务
     ​
     echo "--- 正在重启服务 ---"
     ​
     pm2 restart serviceA
     ​
     ​
     ​
     echo "=== 部署完成 ==="
     ​

    记得把 your_user 和 pm2 restart serviceA 换成你自己的。

  3. 给脚本加上执行权限:

     ​
     chmod +x ~/deploy_A.sh
     ​

现在,每次推送完代码后,你只需要登录服务器,然后执行一个命令就行了:

 ​
 ~/deploy_A.sh
 ​


上一篇 Docker 快速入门:从零到实践的全方位学习笔记
下一篇 MongoDB CRUD 操作指南(类比 MySQL)