Gitの差分ファイルをZIPにまとめるCLIツールを作った

サービス開発や、サーバの権限を持ちGitとの連携が出来る環境下では無縁の内容ですが、受注開発の場合は社内においてのソースコードはGit管理、しかし納品時は差分のみといったパターンがあると思います。

少し調べると関連記事が沢山出てきました。

1〜2番目の記事がCLIから実行できるので、良い感じです。
ただ、git archiveを実行する際、既に削除済みのファイルが存在する場合エラーが発生してしまいました。

そこで少し前に、Node.jsで同じ様な使用感のCLIツールを作ってみました。

インストール方法

Node.jsを使った実装なのでnpmからインストールします。
Node.js0.4.x以降のバージョンが必須です。

$ npm install git-diff-archive -g

使い方

まずはGit管理下の作業ディレクトリへ移動します。

$ cd /your/project/dir/

あとはgit_diff_archiveコマンドにリビジョンを指定して実行するだけです。
git_diff_archiveコマンドにはgdaというエイリアスがあるので、こちらを使うとより短いタイピングで実行できます。

以下のコマンドでは、5つ前までのコミットで変更のあったファイルをzipファイルにまとめています。

$ gda HEAD~5

$ git log --onelineなどで確認したハッシュを使用することも出来ます。

$ gda 845e6bc

実際に実行してみると、以下の様に各種情報が表示されます。

スクリーンショット

表示される内容は以下の内容です。

  • 実行時間
  • 内部で実行されたコマンドの詳細
  • 生成されたファイル名
  • ディレクトリ名
  • ファイル一覧
  • 既にファイルが存在せず除外されたファイル一覧

生成するzipファイルの名前を変えたり、幾つか指定できるオプションがあります。詳細は以下のリポジトリで確認できます。

tsuyoshiwada/git-diff-archive

動作の仕組みと実装について

git_diff_archiveコマンドの実行時に渡したリビジョンをそのままgit diff --name-onlyに渡します。 そこで得られたファイル名の一覧を存在するファイルに限り、zipファイルにまとめる実装をしているだけの簡単な動作になっています。

zipの生成やコマンド引数のパースなど以下のモジュールを使っています。

  • archiver - zip,tarファイルの実装を簡単に実装可能なモジュール
  • cli-spinner - CLI上でスピナーを表示
  • cli-table - CLI上でテーブル上に整形して情報を表示
  • colors - 同じくCLI上で出力に対して色付けして見やすく出来る
  • which - 外部コマンドの存在チェック(gitが存在するか念のためチェックするために使用)
  • minimist - コマンド引数をよしなに処理

始めてCLIツールを作ってみたのですが、大抵欲しい機能はOSSで揃っているので自分の欲しかった機能の実装に注力出来るのは有り難い事だなぁと再認識しました。

おわりに

年末〜年度末まで抱えていた仕事で、サーバの権限も無し+FTP上でアップするファイルは変更した差分ファイルのみ。という環境下での作業だったので、つらみ温かみある手動デプロイの支援ツールとして作ったものになります。

同じ様な環境でCLIからさくっと使えるツールを探していた方がいたら是非使ってみて欲しいなぁなんて思います。

Newer Post SVGで犬のしっぽをフリフリする Older Post GitHubのWebhookをNode.jsで受け取る