不可視ファイルをgitで追跡しないようにする
公開: 2024-11-18 16:27:18(更新: 2024-11-23 10:35:34)
GitHub でファイルを管理する際、コードが中心であったり、Web版のGitHubしか使わなかったりということであれば問題はないので、このペイジは飛ばしてください。しかしながら、たとえばMacでGitHub Desktop.appを使うと、macOS の不可視ファイル(.DS_Store, ._*)までgitが舐めてくれるので、面倒なことが生じます。面倒なだけならばよいのですが、.DS_Store自身がコンフリクトを起こしてしまうと、不可視ファイルなだけにGUIではファイルを扱えないので、シェルが使えないユーザには対処が困難となります。コンフリクトが起こる前に、シェルに慣れている人と一緒に、対処しておいたほうがよさそうです。
- リポジトリのクローン環境(すなわち、ローカル環境で、もし2台のMacを使っているなら、2台ともに実施する必要があります)で、Terminalを使って、以下の設定ファイルを置いてください。
~/.config/git/ignorevi か何かのエディタで
ignoreに.DS_Storeとだけ書いて保存してください(vi の場合には、cd .config/git/; vi ./ignore→ i で insert モード、Esc : →wq; cat などでファイルが正しくできているか確認してください)。このやり方では、リポジトリごとに.gitignoreを置く必要がなく、すべてのリポジトリに対して同様の効果を持ちます。1’. その後、macOS の Finder 操作(つまりGUI)で不可視ファイルも扱えることがわかりました。上記の1.の代わりに、以下の操作でも可能です。Finderで
FileメニューからNew Finder Windowを選び、Command + Shift + .の3つのキーを同時に押します。すると、開いている Finder Window のすべてで不可視ファイルが半透明で表示されます。~/.config/をダブルクリックし、そのなかにconfigというファイル(好みの一般的なMacのエディタなどで)を作成します。あるいは、作成済みのこのファイルをダウンロードし、目的の位置に移動させても問題ありません。なお、目的を達成したら、FInderの先の機能はトグルになっていますので、Command + Shift + .で元に戻ります。 - 引き続き、Terminalを使って、クローンのディレクトリの先頭をカレントディレクトリとして、まずはそこに移動してください。
その後、
find ./ \( -name ".DS_Store" -or -name "._*" \)とすると、それ以下の子・孫ディレクトリなども含めて
.DS_Storeや._*があるとリストで表示します。数が少なければ、手動でrmします。数が多くてつらい場合には、上記をパイプでつないですべてを一括削除します。rm -rfで再帰的に(-r: 自身のなかに含まれるディレクトリ、つまり下位のディレクトリも含めて)強制的に(-f: force, アラートも出さずに)消しますので、気になる場合には、上記のようにして確認してください。 なお、対象ファイル数を数えたい場合にはwcに引き渡します。find ./ \( -name ".DS_Store" -or -name "._*" \) | wc確認をしたら、削除します。
find ./ \( -name ".DS_Store" -or -name "._*" \) | xargs rm -rfxargsは前の処理を受けて、柔軟にパイプ処理を行い、一括処理を可能にします。ただし、ファイル名に特殊文字が使われていると処理がうまくいかない可能性もあるので、findコマンドに-print0オプションをとります。同時に、xargsにも-0オプションを指定するほうがよいかもしれません(未確認)。find ./ \( -name ".DS_Store" -or -name "._*" \) -print0 | xargs -0 rm -rfあるいは
findコマンドの機能を使って(パイプを使わないで)もよいでしょう。find ./ \( -name ".DS_Store" -or -name "._*" \) -exec rm -rf {} +
これで、pushすれば、不可視ファイルがクローン環境からなくなり、以降はgitの探索の対象から外れます。2番の操作に不安がある場合には、シェルに慣れている人に遠隔で対処してもらったのち、pull request を送ってもらい、merge しても同じです。
上記でほぼ問題ないはずですが、gitが不可視ファイルを追跡したままになっている、期待どおりに不可視ファイルを無視してくれないので、キャッシュをクリアします。まずは、当該リポジトリのカレントディレクトリに移動します。そこで、
git rm --cached .DS_Store あるいは git rm --cached .
とします。. はカレントディレクトリを指しますが、それ以下の子・孫ディレクトリなどにも有効です。
蛇足ですが、gitコマンドの基本的な使いかたを以下に記します。ローカルの各リポジトリの先頭(多くの場合は、~/Documents/GitHub/リポジトリ名)にカレントディレクトリを移動します
cd ~/Documents/GitHub/hogehoge/
git status
として、まだ .DS_Store を追跡している旨が記されていれば、上記のキャッシュをクリアします。もう一度git statusをして、削除されていれば、以降は追跡をしなくなります。