GitLab使用LFTP部署主分支:如何仅上传变更文件而非全部
解决GitLab流水线LFTP全量上传问题
问题根源
GitLab流水线每次都在全新临时容器中拉取代码,本地文件的修改时间会被重置为拉取瞬间的时间,而非代码实际提交的修改时间,导致你使用的-n(即--only-newer)参数无法正确识别真正更新的文件,只能触发全量上传。
修复方案
1. 调整LFTP镜像命令参数
修改mirror命令,添加--compare-size参数,同时明确写出--only-newer替代简写-n(避免参数顺序混淆):
lftp -e "set ftp:ssl-allow no;open $FTP_IP; user $FTP_USERNAME $FTP_PASSWORD; mirror -X .* -X .*/ --reverse --verbose --only-newer --compare-size localDir/ remoteDir/; bye"
--compare-size:当时间戳不可靠时,通过文件大小判断文件是否变更,弥补临时环境时间戳失效的漏洞--only-newer:优先用时间戳筛选更新的文件,减少不必要的传输
2. 可选:还原文件的Git提交时间
如果想让时间戳对比完全准确,可以在拉取代码后,把文件修改时间重置为最后一次Git提交该文件的时间,在before_script中添加这段命令:
- git checkout $CI_COMMIT_SHA - git restore --staged . - git ls-files | while read file; do touch -d "$(git log -1 --format="%ai" "$file")" "$file"; done
这样--only-newer就能完全依靠时间戳判断文件是否需要更新。
3. 检查排除规则
确认-X .* -X .*/没有误排除需要同步的文件,比如如果有隐藏的配置文件需要上传,就得调整这个排除规则。
测试方法
可以先添加--dry-run参数测试同步逻辑,不会实际上传文件,方便验证哪些文件会被同步:
mirror -X .* -X .*/ --reverse --verbose --only-newer --compare-size --dry-run localDir/ remoteDir/
内容的提问来源于stack exchange,提问作者Bostjan
相关产品推荐
相关产品推荐

