一、目标

将本地项目通过 Git 推送到云服务器,实现代码同步与部署。

二、整体流程

本地仓库 → git push → 服务器 bare 仓库 → (可选)工作目录 git pull


三、服务器端准备

1. 创建 Git 仓库目录(任意位置)

mkdir -p /root/testcd /root/test

2. 初始化 bare 仓库(关键步骤)

git init --bare

✔ 作用

  • 仅存 Git 版本数据
  • 不包含实际代码文件
  • 用于接收 git push

四、本地配置远程仓库

1. 添加远程仓库

git remote add server root@服务器:/root/test.git

2. 查看远程配置

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