如何编写终端可调用脚本:实现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"
三、使用说明
- 配置修改:先修改脚本开头
配置区的参数,替换成你的项目路径、服务器信息 - 权限设置:运行
chmod +x deploy.sh给脚本添加执行权限 - 执行脚本:在终端运行
./deploy.sh,脚本会先展示Git状态,确认后自动完成提交、推送、上传 - 版本追溯:
deploy-history.log文件会记录每一次部署的时间、版本号和提交信息,方便后续排查问题
四、额外提示
- 确保本地Git已配置好远程仓库的SSH密钥,避免每次推送都输入密码
- 如果需要处理删除文件的场景,可以添加
git diff --name-only --diff-filter=D HEAD^ HEAD获取删除的文件列表,再在服务器上对应删除(谨慎操作!) - 若服务器没有
rsync,直接替换成scp即可,只是增量传输效率会稍低
内容的提问来源于stack exchange,提问作者Jaakko Uusitalo




