You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

半自动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:14:28