文章目录
- 1、rsync实现类似git push pull功能
- 1. 基础概念
- 2. 示例操作
- 3. 定制化和进阶用法
- 4. 定时同步(类似自动化)
- 2 命令简化
- 1. 动态传参的脚本
- 2. Shell 函数支持动态路径
- 3. 结合环境变量和参数(更简洁)
- 4. Makefile 支持动态路径
使用场景,远程有一台无法连接互联网的服务器,性能强大;本地有一台性能差的电脑,但可以上网。那么要合并这两台电脑的功能,取其强,那么做为程序员,就是在本地编辑,再同步到远程,然后在远程执行。
rsync
是一个高效的文件同步工具,但它不像 Git 那样具有版本控制功能。你可以通过
rsync
在本地和远程主机之间同步文件,实现类似 Git 的
push
和
pull
操作。那么将使用rsync实现这个功能
rsyncgit_push_pull_3">1、rsync实现类似git push pull功能
以下是如何用 rsync
实现类似 Git 的 push
和 pull
操作:
1. 基础概念
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 函数,它们最适合经常使用和路径灵活的需求。