行业网站建设运营定制开发微信小程序
文章目录
- 1、rsync实现类似git push pull功能
 - 1. 基础概念
 - 2. 示例操作
 - 3. 定制化和进阶用法
 - 4. 定时同步(类似自动化)
 
- 2 命令简化
 - 1. 动态传参的脚本
 - 2. Shell 函数支持动态路径
 - 3. 结合环境变量和参数(更简洁)
 - 4. Makefile 支持动态路径
 
使用场景,远程有一台无法连接互联网的服务器,性能强大;本地有一台性能差的电脑,但可以上网。那么要合并这两台电脑的功能,取其强,那么做为程序员,就是在本地编辑,再同步到远程,然后在远程执行。
rsync 是一个高效的文件同步工具,但它不像 Git 那样具有版本控制功能。你可以通过 
rsync 在本地和远程主机之间同步文件,实现类似 Git 的 
push 和 
pull 操作。那么将使用rsync实现这个功能 
 
1、rsync实现类似git push pull功能
以下是如何用 rsync 实现类似 Git 的 push 和 pull 操作:
1. 基础概念
- Push:将本地的文件同步到远程。
 - Pull:将远程的文件同步到本地。
 
rsync 的基本语法:
rsync [选项] 源路径 目标路径
 
2. 示例操作
Push 操作:本地 → 远程
rsync -avz --delete /local/path/ user@remote_host:/remote/path/
 
/local/path/是本地目录(注意末尾的/)。user@remote_host:/remote/path/是远程主机的目标路径。- 关键选项: 
-a:归档模式,保留文件权限、时间戳等。-v:显示详细信息。-z:启用压缩,提高传输效率。--delete:删除目标路径中不在源路径中的文件,保持完全同步。
 
Pull 操作:远程 → 本地
rsync -avz --delete user@remote_host:/remote/path/ /local/path/
 
- 语法类似于 
push,只是把源路径和目标路径互换。 
3. 定制化和进阶用法
排除某些文件或目录
 使用 --exclude 选项:
rsync -avz --delete --exclude "node_modules/" --exclude "*.log" /local/path/ user@remote_host:/remote/path/
 
使用 SSH 密钥认证
 为了避免频繁输入密码,可以设置 SSH 密钥认证:
- 生成 SSH 密钥:
ssh-keygen -t rsa - 将公钥复制到远程主机:
ssh-copy-id user@remote_host 
测试同步操作
 使用 --dry-run 选项模拟操作,检查同步内容:
rsync -avz --dry-run /local/path/ user@remote_host:/remote/path/
 
4. 定时同步(类似自动化)
可以使用 cron 或 Windows 任务计划程序实现定时同步。例如:
Linux 上的 cron 示例
 编辑 cron:
crontab -e
 
添加如下内容,每 30 分钟同步一次:
*/30 * * * * rsync -avz --delete /local/path/ user@remote_host:/remote/path/
 
Windows 系统(任务计划程序)
 将 rsync 命令写入 .bat 文件,并通过任务计划程序定时运行。
注意事项
- 没有版本控制:
rsync不支持历史记录,如果需要像 Git 那样的版本管理,可以结合 Git 使用。 - 同步时注意删除操作:使用 
--delete时,要确保备份数据,以免误删文件。 - 网络问题:
rsync的增量同步和中断恢复机制在网络不稳定时非常有用。 
这套流程可以很好地模拟 push 和 pull 的功能,但如果需要更复杂的版本管理功能,建议直接使用 Git。
2 命令简化
如果路径是动态变化的,可以设计一个更灵活的解决方案,让你在运行时传递路径参数。以下是几种方法实现这一需求:
1. 动态传参的脚本
编写一个脚本,支持在运行时指定路径:
脚本内容
 创建一个名为 sync.sh 的脚本,内容如下:
#!/bin/bash# 检查参数
if [ "$#" -lt 3 ]; thenecho "Usage: $0 [push|pull] [local_path] [remote_path]"exit 1
fiACTION=$1
LOCAL_PATH=$2
REMOTE_PATH=$3
REMOTE_USER="user"  # 替换为你的远程用户名
REMOTE_HOST="remote_host"  # 替换为你的远程主机if [ "$ACTION" == "push" ]; thenrsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
elif [ "$ACTION" == "pull" ]; thenrsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
elseecho "Invalid action: $ACTION. Use 'push' or 'pull'."exit 1
fi
 
赋予执行权限
chmod +x sync.sh
 
使用方法
 运行时传递路径:
./sync.sh push /local/path /remote/path
./sync.sh pull /local/path /remote/path
 
2. Shell 函数支持动态路径
在 Shell 配置文件(如 ~/.bashrc 或 ~/.zshrc)中定义一个动态路径的函数:
函数定义
function sync() {if [ "$#" -lt 3 ]; thenecho "Usage: sync [push|pull] [local_path] [remote_path]"return 1filocal action=$1local local_path=$2local remote_path=$3local remote_user="user"  # 替换为你的远程用户名local remote_host="remote_host"  # 替换为你的远程主机if [ "$action" == "push" ]; thenrsync -avz --delete "$local_path" "$remote_user@$remote_host:$remote_path"elif [ "$action" == "pull" ]; thenrsync -avz --delete "$remote_user@$remote_host:$remote_path" "$local_path"elseecho "Invalid action: $action. Use 'push' or 'pull'."return 1fi
}
 
激活函数
source ~/.bashrc  # 或 ~/.zshrc
 
使用方法
sync push /local/path /remote/path
sync pull /local/path /remote/path
 
3. 结合环境变量和参数(更简洁)
在脚本中结合环境变量,减少重复输入常用的用户名和主机名:
脚本内容
#!/bin/bashREMOTE_USER=${REMOTE_USER:-"user"}        # 默认远程用户名
REMOTE_HOST=${REMOTE_HOST:-"remote_host"}  # 默认远程主机if [ "$#" -lt 3 ]; thenecho "Usage: $0 [push|pull] [local_path] [remote_path]"exit 1
fiACTION=$1
LOCAL_PATH=$2
REMOTE_PATH=$3if [ "$ACTION" == "push" ]; thenrsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
elif [ "$ACTION" == "pull" ]; thenrsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
elseecho "Invalid action: $ACTION. Use 'push' or 'pull'."exit 1
fi
 
运行脚本时指定环境变量
REMOTE_USER=myuser REMOTE_HOST=myhost ./sync.sh push /local/path /remote/path
 
4. Makefile 支持动态路径
用 Makefile 传递路径参数:
Makefile 示例
push:rsync -avz --delete $(LOCAL_PATH) user@remote_host:$(REMOTE_PATH)pull:rsync -avz --delete user@remote_host:$(REMOTE_PATH) $(LOCAL_PATH)
 
使用方法
 运行时指定变量:
make push LOCAL_PATH=/local/path REMOTE_PATH=/remote/path
make pull LOCAL_PATH=/local/path REMOTE_PATH=/remote/path
 
通过这些方式,你可以实现动态指定路径,同时保持命令简洁,推荐根据使用场景选择 脚本 或 Shell 函数,它们最适合经常使用和路径灵活的需求。
