Git for windowsのgit bashにrsyncを入れる

WindowsでHugo用の記事を書いて、Git for windowsのgit bashでrsyncを使ってファイルをアップロードする人向けの記事です。

Git for windowsのgit bashにrsyncを入れる

はじめに

Pelican から Hugo への移行検討 で、記事が書けそうなことが分かりました。
次はサーバーにファイルを置くためにrsyncを使おうと思ったところ、Windowsでは少し手間だったので書き残したものです。

前準備: zstdの解凍用パッケージの導入

rsyncのパッケージを解凍するためにztsdを導入する必要があります。
探したところzstd対応版の7-Zipがwingetで簡単に入りそうだったのでこれを使います。(右クリック拡張が増えます)

1
2
3
4
5
> winget search zstd
名前     ID               バージョン         一致      ソース
-------------------------------------------------------------
7-Zip ZS mcmilk.7zip-zstd 21.03 ZS v1.5.0 R2 Tag: zstd winget
> winget install mcmilk.7zip-zstd

rsyncと周辺パッケージの導入

rsyncと必要ライブラリの以下3点を https://repo.msys2.org/msys/x86_64/ からダウンロードします。

  • rsync-3.2.6-1-x86_64.pkg.tar.zst
  • libzstd-1.5.2-2-x86_64.pkg.tar.zst
  • libxxhash-0.8.1-1-x86_64.pkg.tar.zst

それぞれ解凍して、出てきた bin の以下のファイルを C:\Program Files\Git\usr\bin にコピーします。

  • rsync.exe
  • msys-zstd-1.dll
  • msys-xxhash-0.dll

ここまででrsyncコマンドが使えるようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$ rsync -V
rsync  version 3.2.6  protocol version 31
Copyright (C) 1996-2022 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, symlinks, symtimes, hardlinks, no hardlink-specials,
    no hardlink-symlinks, IPv6, atimes, batchfiles, inplace, append, ACLs,
    xattrs, optional secluded-args, iconv, prealloc, stop-at, crtimes
Optimizations:
    no SIMD-roll, no asm-roll, openssl-crypto, no asm-MD5
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

git bashのssh周りの調整

git bashを使うと C:\Users\${USER}\.ssh\config を読んでくれるのですが ~ の展開に失敗してsshがコケる場合があります。

1
2
$ ssh 192.168.122.43
tilde_expand: No such user \\.ssh\\id_rsa

そこで、git bash用の ssh_config を作成しておきます。

1
2
3
Host 192.168.122.42 192.168.122.43
    User admin
    IdentityFile /c/users/ruy/.ssh/id_rsa

ssh単体で使用する場合は ssh -F ssh_config 、rsyncで読み込む場合は -e 'ssh -F ssh_config' のように書くことが出来ます。

rsyncコマンドオプションの調整

Pelicanを使っていた時は適当に -avc オプションを使っていたのですが、今回のケースだと以下のように親ディレクトリのパーミッションも変更しようとしてエラーが出ていたので外しておきます。
(特に直さなくてもアップロード自体は可能なので無視しても良い)

1
2
rsync: failed to set permissions on "/var/www/hugo.ainoniwa.net/.": Operation not permitted (1)
./

最終的にはこんな感じになりました。

1
2
rsync -rlOtvc --delete -e 'ssh -F ssh_config' public/ 192.168.122.43:/var/www/hugo.ainoniwa.net/
rsync -rlOtvc --delete -e 'ssh -F ssh_config' public/ 192.168.122.42:/var/www/hugo.ainoniwa.net/

終わり

これでWindowsでMarkdownを書いて見た目の確認をして、ファイルをワンタッチアップロードするコマンドの準備が出来ました。
hugo + rsync を順番に実行するだけのスクリプトを書いて完了です。

参考文献

Built with Hugo
テーマ StackJimmy によって設計されています。