やりたいこと
.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) }