LoginSignup
1
1

More than 1 year has passed since last update.

最新コミットから差分のあるファイルをscpでサーバーにコピーする

Last updated at Posted at 2021-06-01

たとえば、仮想マシン上にウェブアプリの実行環境を構築し、ファイル編集は手元で行って動作確認するケースなどを想定。

コマンド

以下の例では、サーバーのアドレスが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

filetargetにコピーします。もし、ポートを22から変更している場合は、-Pオプションで指定します。たとえば、ポートが1234の場合は、以下のようにします。

scp -P 1234 file target

なお、このコマンドでは、新しく追加したディレクトリ内のファイルをコピーしようと思うと、「No such file or directory」のエラーになります。また、新規作成したファイルもコピーされません。その場合は、

scp -r src target

srcを再帰的にtarget下にコピーします。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1