Ruby
Rails

Rails プロジェクトに存在する不要な .keep ファイルを削除する


やりたいこと

.keep ファイルのうち同じディレクトリに Git で管理されているファイルが存在するものは要らないので消したい。


方法

次の .keep ファイルは残しておきます。


  • Git で無視されているディレクトリに存在する .keep ファイル


  • .keep ファイルと同じディレクトリに存在するファイルが全て Git で無視されている場合


    • 例えば log/.keep など。



git_ignored_filepaths =

`git status --ignored -s`
.split("\n")
.map { |ignored| Rails.root.join(ignored[/(?<=!! ).+/]) }

Rails.root
.glob('**/.keep')
.select { |path| (path.dirname.children - git_ignored_filepaths).many? }
.reject { |path| git_ignored_filepaths.any? { |ignored| ignored.directory? && path.fnmatch?(ignored.join('**').to_s) } }
.map { |path| path.tap(&:delete) }

なお Ruby 2.5 より前のバージョンでは Pathname#glob が使えないので、次のように書き換えてください。

# Rails.root.glob('**/.keep') の部分を次の行に書き換える。

Dir[Rails.root.join('**/.keep')].map { |path| Pathname(path) }

🔽 コピペ用

git_ignored_filepaths = `git status --ignored -s`.split("\n").map { |ignored| Rails.root.join(ignored[/(?<=!! ).+/]) }

Rails.root.glob('**/.keep').select { |path| (path.dirname.children - git_ignored_filepaths).many? }.reject { |path| git_ignored_filepaths.any? { |ignored| ignored.directory? && path.fnmatch?(ignored.join('**').to_s) } }.map { |path| path.tap(&:delete) }