You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写终端可调用脚本:实现Git提交推送、带版本号且仅传已提交文件至外部服务器

自动化Git提交推送+增量文件上传脚本方案

刚好适配你独自开发时简化流程的需求——这个脚本会帮你完成Git提交推送、仅上传已变更的文件,还会生成可追溯的版本标识,彻底替代手动拖拽的低效操作。

一、核心思路拆解

  • 用Git提交记录生成唯一版本号(短Commit哈希+日期),方便后续追溯每一次部署
  • 先完成Git提交推送流程,确保代码同步到私有仓库
  • 精准提取本次提交的变更文件列表,只上传这些文件到服务器,避免全量上传浪费时间
  • rsync(或scp)做文件传输,比图形化工具更适合自动化场景

二、完整脚本实现

把下面的内容保存为deploy.sh,记得先给脚本加执行权限:chmod +x deploy.sh

#!/bin/bash

# -------------------------- 配置区 --------------------------
# 本地Git仓库路径(替换成你的项目路径)
GIT_REPO_DIR="/Users/you/projects/your-repo"
# Git提交信息(自动带时间戳)
GIT_COMMIT_MSG="Auto deploy: $(date +'%Y-%m-%d %H:%M:%S')"
# 服务器配置(替换成你的服务器信息)
SERVER_USER="your-server-username"
SERVER_HOST="your-server-ip-or-domain"
SERVER_DEST_DIR="/var/www/your-project"
# 版本日志存储路径(本地记录,方便追溯)
VERSION_LOG_FILE="$GIT_REPO_DIR/deploy-history.log"
# -----------------------------------------------------------

# 切换到Git仓库目录,失败则退出
cd "$GIT_REPO_DIR" || { echo "❌ 找不到Git仓库目录!"; exit 1; }

# 1. 检查Git工作区状态,确认是否要继续
echo "=== 检查Git工作区状态 ==="
git status
read -p "确认要提交并部署以上变更吗?(y/N): " CONFIRM
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
    echo "✅ 部署已取消"
    exit 0
fi

# 2. 执行Git提交和推送
echo "=== 开始Git提交推送 ==="
git add .
git commit -m "$GIT_COMMIT_MSG"
# 默认推送到当前分支的origin远程仓库,可根据需求修改分支名
git push origin HEAD

# 3. 生成版本标识(短Commit哈希+日期)
COMMIT_HASH=$(git rev-parse --short HEAD)
VERSION_TAG="v$(date +'%Y%m%d')-$COMMIT_HASH"
echo "=== 本次部署版本号: $VERSION_TAG ==="

# 4. 获取本次提交的变更文件列表
echo "=== 收集变更文件 ==="
CHANGED_FILES=$(git diff --name-only HEAD^ HEAD)
if [[ -z "$CHANGED_FILES" ]]; then
    echo "⚠️ 本次提交没有变更文件,部署结束"
    exit 0
fi

# 5. 上传变更文件到服务器
echo "=== 开始上传文件到服务器 ==="
# 优先用rsync(支持增量传输、权限保持),如果服务器没有rsync可换成scp
for FILE in $CHANGED_FILES; do
    if [[ -f "$FILE" ]]; then
        echo "📤 上传文件: $FILE"
        rsync -avz "$FILE" "$SERVER_USER@$SERVER_HOST:$SERVER_DEST_DIR/$(dirname "$FILE")"
        # 若用scp替代:scp "$FILE" "$SERVER_USER@$SERVER_HOST:$SERVER_DEST_DIR/$(dirname "$FILE")"
    elif [[ -d "$FILE" ]]; then
        echo "📤 上传目录: $FILE"
        rsync -avz "$FILE/" "$SERVER_USER@$SERVER_HOST:$SERVER_DEST_DIR/$FILE/"
    fi
done

# 6. 记录版本信息到日志
echo "$(date +'%Y-%m-%d %H:%M:%S') | 版本号: $VERSION_TAG | 提交信息: $GIT_COMMIT_MSG" >> "$VERSION_LOG_FILE"
echo "✅ 部署完成!版本记录已保存到 $VERSION_LOG_FILE"

三、使用说明

  1. 配置修改:先修改脚本开头配置区的参数,替换成你的项目路径、服务器信息
  2. 权限设置:运行chmod +x deploy.sh给脚本添加执行权限
  3. 执行脚本:在终端运行./deploy.sh,脚本会先展示Git状态,确认后自动完成提交、推送、上传
  4. 版本追溯deploy-history.log文件会记录每一次部署的时间、版本号和提交信息,方便后续排查问题

四、额外提示

  • 确保本地Git已配置好远程仓库的SSH密钥,避免每次推送都输入密码
  • 如果需要处理删除文件的场景,可以添加git diff --name-only --diff-filter=D HEAD^ HEAD获取删除的文件列表,再在服务器上对应删除(谨慎操作!)
  • 若服务器没有rsync,直接替换成scp即可,只是增量传输效率会稍低

内容的提问来源于stack exchange,提问作者Jaakko Uusitalo

火山引擎 最新活动