How to use git-ftp

最近「寺子屋」と称して個人レッスンというか、数名規模の私塾みたいなことをやっているこもりです。こんにちは。

寺子屋については年が明けてからあらためてお知らせするとして、寺子屋の参加者の皆さんの間などでよく「Gitは使ってるんだけど、アップロード先がFTPしかだめで…。どうにかなりませんかね?」みたいな質問を受けることがあります。もったいないですね。手元は効率化できてるのに、最後の最後がそれじゃ。

アップロード先がFTP(とかSFTP)しか使えない場合は、「dploy.io」とか「Deploy」みたいにGitHubとかBitBucket、自分のリモートのリポジトリからデプロイだけやってくれるサービスを使ったり、むしろその辺も一緒くたになった「Beanstalk」みたいなのを使うと簡単なのですが、いかんせんそれなりにお金はかかります(その辺の話はここに書いてます)。

それ以外にもう少し簡単にできる良い方法はないものか、ということで「git-ftp」なんてのを紹介してみましょう。

git-ftpとは?

git-ftp-push

世の中にはいろいろな環境があって同様に困る人たちがいるわけで、そんな人たちの救世主が「git-ftp」です。簡単にいえば、GitのコマンドにFTPを使ったアップロード(というか同期処理)を追加してくれる素晴らしいものです。

git-ftpはコマンドラインのツールですので、Homebrewとか環境に合わせてインストールしてください。

$ brew install git-ftp

「libsshがうんたら」とかアラートがでたら、curlをオプション付きでインストールし直しましょう。

$ brew install curl --with-ssl --with-libssh2

これで準備は完了。

git-ftpを使う

gtp-ftpを使ってデータを同期するには、Gitの管理下にあるディレクトリでなければいけません(コミットログをみて同期処理をおこなうので)。アップロードを実行したいプロジェクトのディレクトリで初めて使う時には、「git ftp init」で必ずリモートのサーバと一度接続する必要があります。

$ git ftp init -u username -p - ftp://example.com/public_html

細かいオプションについては、git-ftpのマニュアルでも見ていただくとして、とりあえず「username」と「ftp://example.com/public_html」を自分の環境に合わせて変更して実行します。この例でいくと「ftp://~」のところは、リモートホストとその中のアップロード先のディレクトリです。

-p」はパスワードのオプションなので、MySQLなんかと同じでパスワードの入力が促されたらパスワードを入れましょう。「-p aiueo123」のようにコマンドにパスワード入力すればそのまま進みます(え、そこで直打ちなのとか言わないでね。嫌ならSFTPとか使って鍵認証のオプションでも使いましょう。詳しくはマニュアルを)。

一度リモートサーバとの同期が取れれば、あとは「git ftp push」コマンドを打てばOKです。Gitでコミットすれば変更履歴が残りますから、それを元にリモートのサーバとファイルを同期するようになっているので必要なファイルだけがやりとりされます。

$ git ftp push -u username -p - ftp://gaspanik.com/public_html

はい。これならGitが使えなくてもFTPクライアントを立ち上げる必要もありませんし、何よりコミットログベースなのでアップロードし忘れみたいなこともおきませんね。

※同期は「dist」ディレクトリ以下を…、みたいなこともできますよ。

gulpからgit-ftpを実行する

サイト制作時に「gulp」とか使っている方は、タスクとして「git ftp init」や「git ftp push」を登録しちゃうのもひとつの方法です。参考までに下記に「gulpfile.js」のサンプルを用意してみました。

他のgulpのプラグインと組み合わせるとかGitのフックに絡めるとかそういうのではなく、単純にシェルで実行しているだけの代物です。コマンドは「gulpfile.js」に書いてるだけなのですが、やはり初回の接続時のみ「gulp ftp-init」を実行します。

$ gulp ftp-init

2回目からは「gulp ftp-push」だけで、コミットログの差分をみて必要なファイルだけが同期されます。

$ gulp ftp-push

シェルのエイリアスとして「alias gfp="gulp ftp-push"」とか登録すれば、サイトごとにgulpfile.jsの設定だけ用意するだけで以下のコマンドでアップロードできますね。

$ gfp

ま、そんな感じです。

git-ftpがあれば、Git使いながらFTPでアップロードすることもできるよ、と。


※SourceTree使ってるなら、git ftp pushのコマンドを書いたシェルスクリプトを用意して、カスタムアクションで登録すればあの画面から実行できますね。


と、寺子屋では参加者個々人がいろいろ抱える問題や質問を解決するようなこともできる限りしています。