Git管理下で修正したファイルだけをサーバに上げるスクリプト
複数人の並行開発で、開発用サーバを共有している場合などに、
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を実行しているところも、
環境に応じて ftp
や aws s3 cp
などに変更すれば対応出来ると思います。
また、Git管理下に無いファイル(Untracked files)を対象にする場合は、
例えば、次のGitコマンドの出力に対しても処理を行うと良いです。
git --no-pager status --short | grep ^\?\? | sed -e "s|^\?\? ||" | grep -v ^../ | grep -v /$$
以上。