複数人の並行開発で、開発用サーバを共有している場合などに、
Gitで管理しているファイルで、
自分の作業ブランチで修正したファイルだけをサーバに上げたいことがあります。

都度、修正したファイルを選んでアップロードするのは、
手間がかかり、ミスの原因にもなるので、スクリプトを書いてみました。

# コンテナ技術などを使って、
# 開発用サーバを共有しないようにすべきという意見もあるとは思いますが。。

sync_diff.sh

#!/bin/sh

SERVER_HOST=server00
SERVER_PATH=/var/www/html

diff_sync() {
  dryrun=$1
  for f in $(git --no-pager diff origin/master --name-only); do
    if [[ ! ${f} =~ ^\. && ! ${f} =~ /\. ]]; then
      if [ "${dryrun}" = "dryrun" ]; then
        echo $f
      else
        scp $f $SERVER_HOST:$SERVER_PATH/$f
      fi
    fi
  done
}

diff_sync dryrun

read -p "Upload OK?  (y/N) :" q
if [ "${q}" = "y" ]; then
  diff_sync
fi

使い方

SERVER_HOST, SERVER_PATH を環境に合わせて書き換えます。

シェルスクリプトを実行します。

% sh sync-diff.sh    
dir/file.html
Upload OK?  (y/N) :

対象ファイルが表示されるので、
Upload OK?yと答えると、アップロードされます。

実装の説明

次のGitコマンドで、修正があったファイルのリストが出力されるので、
この出力に対して、アップロード処理を実行しています。

git --no-pager diff origin/main --name-only

条件 if [[ ! ${f} =~ ^\. && ! ${f} =~ /\. ]]; はdotfileの除外です。

scpを実行しているところも、
環境に応じて ftpaws s3 cp などに変更すれば対応出来ると思います。

また、Git管理下に無いファイル(Untracked files)を対象にする場合は、
例えば、次のGitコマンドの出力に対しても処理を行うと良いです。

git --no-pager status --short | grep ^\?\? | sed -e "s|^\?\? ||" | grep -v ^../ | grep -v /$$

以上。