たとえば、仮想マシン上にウェブアプリの実行環境を構築し、ファイル編集は手元で行って動作確認するケースなどを想定。
コマンド
以下の例では、サーバーのアドレスが192.168.56.101
で、ユーザー名がalice
だとします。また、サーバーのホームディレクトリ直下にabcproject
ディレクトリがあり、これ以下の階層は、手元のGitリポジトリと同一であるものとします。
git diff --name-only | xargs -I '{}' scp '{}' alice@192.168.56.101:abcproject/{}
解説
git diff --name-only
で最新コミットから差分のあるファイル名を、Gitリポジトリのルートからの相対パスで取得します。
xargs command
で標準入力をcommandの引数に渡します。
-I
オプションは置換文字列の指定です。コマンド文字列中の置換文字列を標準入力で置き換えます。したがって、標準入力にたとえばindex.html
src/app.js
が渡された場合、
xargs -I '{}' scp '{}' alice@192.168.56.101:abcproject/{}
は
scp 'index.html' alice@192.168.56.101:abcproject/file1
scp 'src/app.js' alice@192.168.56.101:abcproject/src/app.js
と同じ動きになります。なお、xargs
はオプション無しで使用した場合、command file1 file2 file3
のように標準入力を一度にコマンドの引数に渡しますが、-I
オプションを指定した場合は、標準入力は一行ずつ渡されます。
scp file target
でfile
をtarget
にコピーします。もし、ポートを22から変更している場合は、-P
オプションで指定します。たとえば、ポートが1234の場合は、以下のようにします。
scp -P 1234 file target
なお、このコマンドでは、新しく追加したディレクトリ内のファイルをコピーしようと思うと、「No such file or directory」のエラーになります。また、新規作成したファイルもコピーされません。その場合は、
scp -r src target
でsrc
を再帰的にtarget
下にコピーします。