Se as alterações estão ocorrendo apenas localmente (ou seja, uma sincronização unidirecional), você pode pensar apenas em usar um arquivador (zip, tar, etc) para arquivar os arquivos modificados para transporte até o servidor remoto. Presumivelmente, você pode usar a data de modificação, o bit de arquivamento ou, no pior dos casos, manter uma segunda cópia local para usar como base para determinar quais arquivos foram alterados.
O rsync e outros programas de cópia delta são legais, mas eu suspeito que o seu problema pode ser simples o suficiente para resolver sem chegar a esse extremo. Com um grande número de arquivos pequenos, você também passará por muitos atrasos usando o rsync devido à latência.
Como sua origem é uma máquina Windows, você pode usar o bit "Archive" como um indicador para quais arquivos foram modificados (assumindo que o processo de atualização está alterando o bit de archive). Você poderia fazer algo simples como:
@echo off
set SRC=C:\source
set STAGING=C:\staging
rem Copy all files from source to staging, including subdirectories,
rem where "Archive" bit is set.
xcopy "%SRC%\*" "%STAGING%\" /e /s /a
rem Untick archive bit on all files in source
attrib /S /D -A "%SRC%\*"
Isso deixaria o diretório "staging" preenchido apenas com os arquivos que foram alterados (embora com subdiretórios vazios para todos os diretórios onde os arquivos não foram alterados também). Ele também redefiniria o bit de arquivamento em todos os arquivos em todas as subpastas. Você poderia zerar o diretório de preparação (usando seu programa ZIP de linha de comando favorito) e enviá-lo para o servidor remoto para descompactação.
Isso não oferece nenhuma compactação delta, mas em um tamanho médio de 51KB / arquivo, parece que a compactação delta não ajuda muito e a latência "win" desse método simplista pode ser melhor para você.