一、目标
将本地项目通过 Git 推送到云服务器,实现代码同步与部署。
二、整体流程
本地仓库 → git push → 服务器 bare 仓库 → (可选)工作目录 git pull
三、服务器端准备
1. 创建 Git 仓库目录(任意位置)
mkdir -p /root/testcd /root/test2. 初始化 bare 仓库(关键步骤)
git init --bare✔ 作用
- 仅存 Git 版本数据
- 不包含实际代码文件
- 用于接收
git push
四、本地配置远程仓库
1. 添加远程仓库
git remote add server root@服务器:/root/test.git2. 查看远程配置
git remote -v五、本地推送代码
git push server master或:
git push server main六、推送成功标志
[new branch] master -> master表示:
- ✔ 推送成功
- ✔ 服务器已接收 Git 数据
七、问题总结
❌ 问题1:main 分支不存在
报错
error: src refspec main does not match any原因
- 本地没有 main 分支
解决
git branch
git push server master❌ 问题2:远程仓库不是 Git 仓库
报错
does not appear to be a git repository原因
- 没有执行
git init --bare - 或路径错误
解决
git init --bare❌ 问题3:路径写错
错误示例
git/root/test.git正确示例
/root/test/root/test.git❌ 问题4:push 成功但看不到文件
现象
lsbranches config HEAD objects refs原因
- bare 仓库不会存放源码文件
八、核心概念
1. bare 仓库
只存 Git 数据,不存代码文件2. push 本质
push = 上传版本数据,不是上传文件目录九、标准部署方式(推荐)
服务器结构
/root/test.git ← bare 仓库(存版本)/root/app ← 工作目录(运行代码)服务器克隆工作目录
cd /rootgit clone /root/test.git app更新代码
cd /root/appgit pull十、完整推荐流程
服务器
mkdir -p /root/testcd /root/testgit init --bare本地
git remote add server root@IP:/root/testgit push server master服务器运行目录
cd /root/appgit pull十一、是否需要 pull(重点)
| 场景 | 是否需要 pull |
|---|---|
| 只有 bare 仓库 | ❌ 不需要 |
| bare + 工作目录 | ✅ 需要 |
| Git Hook 自动部署 | ❌ 不需要 |
十二、一句话总结
git push 只更新仓库数据,不会自动更新运行目录运行代码目录必须 git pull 才会同步十三、自动化
服务器端
打包推送执行文件push.sh:
#!/bin/bash
# 打包项目
bun run build
# 删除源文件
rm -r /home/ash70/vscodeProjects/blog/dist
# 复制文件夹
cp -r "./dist" /home/ash70/vscodeProjects/blog
# cd过去
cd /home/ash70/vscodeProjects/blog
echo "📦 开始执行 Git 提交流程..."
# ====== 1. 添加所有文件 ======
git add .
if [ $? -ne 0 ]; then
echo "❌ git add 失败"
exit 1
fi
echo "✅ git add 完成"
# ====== 2. 提交代码 ======
git commit -m "blog"
# 判断是否有内容提交
if [ $? -ne 0 ]; then
echo "⚠️ git commit 失败(可能是没有改动)"
else
echo "✅ git commit 完成"
fi
# ====== 3. 推送到远程 server ======
git push server master
if [ $? -ne 0 ]; then
echo "❌ git push 失败"
exit 1
fi
echo "🎉 推送成功完成"
云服务器端钩子
在接收推送的git目录下的hooks目录中创建并编辑 post-receive 钩子文件
cd /root/blog.git/hooks然后vim post-receive
之后给执行权限
chmod + x /root/blog.git/hooks/post-receive
#!/bin/sh
# 清空 Git 自带环境变量,避免目录锁定
unset GIT_DIR
echo "========================================"
echo " Received Git Push, Starting Auto Deployment..."
echo "========================================"
# 进入项目工作目录,若目录不存在则退出
cd /root/blog || {
echo "❌ Error: Cannot enter project directory /root/blog"
exit 1
}
# 拉取最新代码
git pull
echo "========================================"
echo " Auto Deployment Completed Successfully!"
echo "========================================"
# 4. 给钩子文件添加执行权限(必做步骤)
chmod +x post-receive