半自动SFTP上传/部署:如何配置文件忽略规则(无SSH连接)
解决半自动SFTP上传(基于排除规则/复用.gitignore)的方案
嘿,我刚好碰到过类似的需求,给你整理一套完全适配你场景的bash脚本方案吧!毕竟没法用SSH的话,确实只能纯靠SFTP来实现,还要复用.gitignore的排除规则,同时搞半自动上传,咱们一步步来:
1. 先从.gitignore生成要排除的文件列表
如果你的项目已经用Git管理,那直接用Git命令就能导出所有被.gitignore标记忽略的文件/目录,超方便:
# 把所有被.gitignore忽略的文件路径导出到ignore-list.txt git ls-files --exclude-standard --others --ignored > ignore-list.txt # 要是有些已经被Git追踪的文件你也想排除,就加个--cached参数追加进去 # git ls-files --exclude-standard --ignored --cached >> ignore-list.txt
要是没用到Git也没关系,你手动写个custom-ignore.txt,每行一个排除模式(比如*.sql、node_modules/),然后用find把这些模式转换成具体的文件路径:
# 跳过注释行,逐个处理排除模式 grep -v '^#' custom-ignore.txt | while read pattern; do find . -type f -name "$pattern" | sed 's|^\./||' >> ignore-list.txt done # 去重避免重复排除 sort -u ignore-list.txt -o ignore-list.txt
2. 生成SFTP上传命令列表
接下来咱们要生成只包含非排除文件的SFTP put命令,直接写到你说的sftp-pattern文件里:
# 先清空原有命令文件 > sftp-pattern # 找出所有不在排除列表里的文件,逐个生成上传命令 find . -type f | sed 's|^\./||' | grep -vxFf ignore-list.txt | while read file; do # 先提取文件的目录路径,确保服务器上有对应的目录 dir=$(dirname "$file") if [ "$dir" != "." ]; then # 用mkdir -p创建递归目录,即使目录存在也不会报错 echo "mkdir -p $dir" >> sftp-pattern fi # 生成put命令,用引号包裹文件名避免空格/特殊字符出问题 echo "put \"$file\" \"$dir/\"" >> sftp-pattern done # 最后加个exit命令,方便执行完自动退出SFTP echo "exit" >> sftp-pattern
3. 半自动执行SFTP上传
现在你可以先预览一下生成的命令,确认没问题再执行:
# 先看一眼要执行的SFTP命令,避免踩坑 cat sftp-pattern # 用-b参数指定命令文件,同时保持交互模式(方便输入密码或者中途确认) sftp -b sftp-pattern your-sftp-user@your-sftp-server
如果是用密钥认证的话,加上-i参数指定密钥文件就行:
sftp -i ~/.ssh/your-key.pem -b sftp-pattern your-sftp-user@your-sftp-server
4. 优化半自动流程
要是你想更灵活,比如生成命令前先确认排除的文件,或者手动选择要不要继续,可以加个确认步骤:
echo "以下是本次要排除的文件/目录:" cat ignore-list.txt read -p "确认生成上传命令吗?(y/n) " confirm if [ "$confirm" != "y" ]; then echo "已取消操作" exit 1 fi
另外,要是你的排除规则里有目录(比如node_modules/),记得加上目录处理逻辑,避免上传目录下的所有文件:
# 处理目录排除的逻辑,加到手动生成ignore-list的脚本里 grep -v '^#' custom-ignore.txt | while read pattern; do if [[ "$pattern" == */ ]]; then # 处理目录模式,比如node_modules/ find . -type d -name "${pattern%/}" | sed 's|^\./||' >> ignore-list.txt else # 处理文件模式,比如*.sql find . -type f -name "$pattern" | sed 's|^\./||' >> ignore-list.txt fi done
小提醒
- 有些SFTP服务器可能不支持
mkdir -p递归创建目录,这时候你得写个小函数拆分路径逐个创建,不过大部分主流服务器都支持~ - 文件名带空格或者特殊字符的时候,一定要用双引号包裹,不然SFTP会报错
这样一套流程下来,就能完美实现你要的:基于排除规则(包括复用.gitignore)的半自动SFTP上传,不用手动写所有put命令,也能确保不上传你不想传的文件啦!
内容的提问来源于stack exchange,提问作者denns
相关产品推荐
相关产品推荐

