Windows下使用Git+rsync构建文件同步工具

最近工作很忙,常常需要把一些需要继续处理的文件拷贝到U盘,带回家继续处理;在文件比较少的情况下还好,在文件特别多、或者特别大的情况下,处理起来就会比较麻烦。于是我意识到需要用一个工具来完成这个文件同步的工作,自然而然就想到了 Linux 平台上的 rsync;rsync 的优点是显而易见的:支持网络和本地传输,支持断点传输,最重要的是——支持增量更新,这也就让它在处理多文件、大文件的时候更加有优势了。

那么能否实现在 Windows 系统中运行 rsync 呢?在网上找了一些资料并折腾了一番,发现是可以实现的。

一、原理

如何在 Windows 下跑 rsync ?

rsync 是 Linux 平台的程序,要在 Windows 运行,要么就是拿源码在Windows环境下重新编译一遍,那么就会用到 MinGW 这类的编译工具,并且改动源码肯定是少不了的;要么就是在 Windows 下搞一个 Linux 的虚拟环境,那么可以考虑 Cygwin, WSL 这类东西。有没有更简单的方法呢?想到在 Windows 下使用 Git Bash 工具的时候,也经常会使用到 ls, grep 这类 Linux 下的命令,那么这个又是如何实现的?

找了一些资料,发现 Git for Windows 是基于 MSYS 做出来的。以下引用一段来自知乎网友的话:

(来源:https://www.zhihu.com/question/65055974/answer/227054790)

MSYS

当 MinGW 出现之后,程序员们发现光有 GCC 不行啊,面对着如此 naive 的 Windows 命令行也照样不能干活,Cygwin 又太大了。所以 MinGW 的一群人再次 fork 了 Cygwin,把它精简了一番,就成了 MSYS。后来,MinGW 咕咕咕了,MSYS 也随之咕咕咕了,又一群程序员 fork 了新版本的 Cygwin,精简了一番,给它加上了 Pacman 包管理器(没错就是 Arch Linux 用的那个),最后给 MSYS 的名字后面加了个 2,成了 MSYS2。

Git for Windows

随着 Git 的快速完善,将 Git 移植到 Windows 的呼声越来越高,可是 Git 需要很多 Linux 下的命令行工具,所以不想重复造轮子的 Git 开发者们找到了 MSYS2,又将 MSYS2 做了一番精简和针对 Git 的修改,把 Git 放了进去。

ls, grep 这些程序包正是通过 Pacman 去管理的。而在 Git 的安装目录下也是可以找到这些程序包的 exe 文件的(在 Git/usr/bin 目录下)。

那么,是不是找到了 rsync 在 Windows 平台的 pacman package,同样就可以实现在 Windows Git Bash 中运行 rsync 呢?

答案确实是如此的。这篇文章就将介绍这个实现过程。

二、下载安装包

可在此处下载 windows 环境下的 Pacman package: http://www2.futureware.at/~nickoe/msys2-mirror/msys/x86_64/

我们需要使用到以下的两个 package: zstd 和 rsync。(zstd 是用来解压 rsync 的程序包的)

zstd:

Windows下使用Git+rsync构建文件同步工具_第1张图片

rsync:

Windows下使用Git+rsync构建文件同步工具_第2张图片

选择其中最新的版本来下载即可。

如,我将 zstd-1.4.5-2-x86_64.pkg.tar.xz 和 rsync-3.2.3-1-x86_64.pkg.tar.zst 下载到 D:\tools 目录下。

三、使用 zstd

使用 7zip 等Windows下的解压工具解压 zstd-1.4.5-2-x86_64.pkg.tar.xz。

将 zstd 的相关文件复制到 Git 安装目录的对应位置,如:

D:\tools\zstd-1.4.5-2-x86_64.pkg\usr\bin --> D:\Program Files\Git\usr\bin
D:\tools\zstd-1.4.5-2-x86_64.pkg\usr\share --> D:\Program Files\Git\usr\share

使用 zstd 来解压 rysnc 包。打开 Git Bash,执行:

cd  /d/tools/
mkdir rsync-3.2.3-1
tar -I zstd -xvf /d/tools/rsync-3.2.3-1-x86_64.pkg.tar.zst  -C /d/tools/rsync-3.2.3-1

四、使用 rsync

将 rsync 的相关文件复制到 Git 安装目录的对应位置,如:

D:\tools\rsync-3.2.3-1\usr\bin --> D:\Program Files\Git\usr\bin
D:\tools\rsync-3.2.3-1\usr\lib --> D:\Program Files\Git\usr\lib
D:\tools\rsync-3.2.3-1\usr\share --> D:\Program Files\Git\usr\share

在 Git Bash 中使用 rsync:

# 查看版本号
rsync --version
# 查看帮助信息
rsync -h
#  同步文件
rsync -avP <src_dir> <dest_dir>

以下是实际使用的例子:

Windows下使用Git+rsync构建文件同步工具_第3张图片

五、编写 shell 脚本

为了更加方便使用,还可以将 rsync 命令写入脚本来运行。

如,我写了如下的 sync_to_udisk.sh 用来将我本地目录的文件夹同步到U盘上:

rsync -avP --exclude-from './ExcludeLists.txt' /d/LocalDir/ /f/UdiskDir/
# 以下休眠3秒只是为了看一下执行过程,完全可以去掉 :)
sleep 3

这样每次要进行文件同步的时候,只需要双击 sync_to_udisk.sh 让 Git Bash 自动运行即可。

命令中的--exclude-from 选项用来排除不需要同步的文件,可以将要排除的文件写入到 ExcludeLists.txt 中。

如以下这样,是把 sync_to_udisk.sh 和所有隐藏文件排除掉:

.*
sync_to_udisk.sh

你可以根据你的实际需求,写不同的脚本来实现。

最后,希望这篇文章可以帮助到所有遇到同样问题的小伙伴们。

Enjoy ~

参考

http://www.mingw.org/wiki/msys

https://wiki.archlinux.org/index.php/Pacman

http://www.ruanyifeng.com/blog/2020/08/rsync.html

https://www.jianshu.com/p/e3f17590c7d4

https://blog.tiger-workshop.com/add-rsync-to-git-bash-for-windows/

https://www.zhihu.com/question/65055974/answer/227054790

你可能感兴趣的:(开发环境,windows,git,rsync)