インフラ

【Git】1行で「.gitignoreで管理除外しているファイル一覧」を取得する方法

更新日:

どうしても.gitignoreで除外しているファイル一覧を取得したかった……。

そもそもの経緯

当初、AWSのCodeDeployとCodePipelineを使用して、Blue/Greenデプロイ環境を作成しようと考えていました。

CodePipelineとGitHubを連携し、CodeDeployを使用したアプリケーション自動デプロイを行うつもりでしたが、
実装にあたり、.gitignoreで除外しているファイルがネックになってきました。

CodeDeployでは、デプロイ先のファイルパスに同名のファイルが存在する場合(重複する状態)、
デプロイに失敗してしまいます(現状、自動で入れ替えを行ってくれる機能が無いようです)。

そのためもし実装する場合はCodeDeployの「ライフサイクルイベントフック」により、
デプロイ前(BeforeInstallイベントなどのタイミング)に既存のアプリケーションを削除する処理を挟む必要があるのです。

参考:ライフサイクルイベントフックのリスト
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html#reference-appspec-file-structure-hooks-list

 

何故やりたいと思ったのか

しかしながら、1点問題がありました。
それが.gitignoreでソース管理除外対象となっているソースファイル達です。

BeforeInstallイベントで既存のアプリケーションのファイルを削除するのは簡単ですが、
gitによる管理から除外されているファイルだけは削除せずに残しておかないと、CodeDeployでgithubのpush内容が自動でデプロイされても除外されているファイルは返ってこないのです。

AfterInstallで別の場所(S3など)から除外ファイルをダウンロードしてくる方法も今思いつきましたが、
その時はどうにか「除外ファイルだけは削除対象から外さなければならない!そのためにはgitの除外ファイルだけを取得しなければ!」と悩んでいたのです。

除外ファイルの相対パスは.gitignoreに1行刻みで記載されていますが、当然コメントアウトされている行もありますし、
シェルで1行ずつ読み込むのもスマートではない気がします。

また相対パスで記載されているので、.gitignoreのあるファイル絶対パスのカレントディレクトリとくっ付ける作業もかなり手間に感じました。
(相対パスの先頭は./などから始まっているため、単純にくっつけるわけにはいかないでしょう)

だから、削除を行わないファイルをすべて絶対パスで取得したいと思ったのです。

 

やってみた

ずばり!
以下の1行を実行すると、実行ディレクトリ以下の.gitignore対象のファイルパスを絶対パスで取得することが出来る。
なので、全ての.gitignore対象ファイルを取得するなら、このコマンドをアプリケーションホームで実行する。

git ls-files --other --ignored --exclude-standard | xargs -n1 readlink -f

 

おわりに

でも今覚えば、もう少し上手い実装方法があったような気がしています。

何かいい方法があれば教えて頂ければ幸いです。
よろしくお願いいたします。

それでは、お疲れさまでした。

 

 

 

-インフラ
-, ,

Copyright© すじこネット , 2019 - 2021 All Rights Reserved Powered by STINGER.