OneDrive にも .gitignore がほしい

2024/01/12に公開

Git / GitHub を使っていても,最終的には OneDrive などのクラウドストレージにバックアップを取っておきたいという需要があると思います.しかし,OneDrive には同期対象から除外するファイル・フォルダを設定する機能が明示的には用意されていません.この記事では,OneDrive において同期対象から除外するファイル・フォルダを設定する方法について紹介します.この方法により,node_modules.venv などの不要なフォルダを同期対象から除外することができ,クラウドストレージ容量の節約や同期中の状態が解消されない問題の解決に役立つかもしれません.

1. はじめに

紹介する手法は以下のとおりです:

  • 除外されたファイル拡張子
  • フォルダーの選択
  • odignore.txt
  • ClientPolicy.ini
  • NucleusUpdateRingConfig.jsonPreSignInSettingsConfig.json

2. 除外されたファイル拡張子

2.1. 手順

手順は以下のとおりです:

  1. OneDrive の設定を開く
  2. 同期とバックアップ > 詳細設定 > 除外されたファイル拡張子 より「除外」を選択
  3. 除外するファイル拡張子を入力し,「除外」を押下

2.2. 原理

OneDrive に搭載されている機能を,本来の目的で使用しているだけです.

2.3. 問題点

問題点は以下のとおりです:

  • クライアントごとに設定が必要
  • フォルダが除外できない
  • ファイルもファイル拡張子単位でしか除外できない
  • そもそも機能してない

根本的に機能してないのはどういうわけなんでしょうか.なお,すでに OneDrive にバックアップされているファイルには適用されない点にも注意が必要です.

3. フォルダーの選択

3.1. 手順

手順は以下のとおりです:

  1. 同期から除外したいフォルダについて,中身を別の場所に移動
  2. OneDrive の設定を開く
  3. アカウント > フォルダーの選択 より「フォルダーの選択」を選択
  4. 同期から除外したいフォルダを選択し,「OK」を押下
  5. 別の場所に移動したものを元のフォルダに戻す

3.2. 原理

OneDrive の「フォルダーを選択」機能は,本来クラウドストレージ上のフォルダをローカルに同期しないための機能です.これを逆手にとり,予めクラウドストレージ上にフォルダを作成しローカルの同期対象から除外することで,ローカルでの変更がクラウドストレージに反映されないようにすることができます.

3.3. 問題点

問題点は以下のとおりです:

  • クライアントごとに設定が必要
  • 手順が煩雑
  • プロジェクトごとに設定が必要
  • 「同期の問題」として表示される

4. odignore.txt

4.1. 手順

手順は以下のとおりです:

  1. C:\Users\%USERNAME%\AppData\Local\Microsoft\OneDrive\settings\Personal\odignore.txt を開く
  2. 除外したいファイル・フォルダのパターンを記述

4.2. 原理

実はこの odignore.txt は,「除外されたファイル拡張子」の設定によって生成されるファイルです.しかし,「除外されたファイル拡張子」の設定画面から設定する場合と異なり,拡張子だけでなく自由なパターンを記述することができます.odignore.txt に直接パターンを記述すると,OneDrive の設定画面にも反映されます.UI の記述もちゃんとパターンに対応したものになっており,機能的には対応するつもりであることが伺えます.将来的には OneDrive の設定画面からもパターンを記述できるようになるかもしれません.あるいは,OneDrive for Business では管理者設定でファイル・フォルダの除外ができるらしいので,そのための機能なのかもしれません.

4.3. 問題点

問題点は以下のとおりです:

  • クライアントごとに設定が必要
  • 機能してない

現状「除外されたファイル拡張子」が機能していないためもちろんフォルダの除外も機能していません.しかし,「除外されたファイル拡張子」についてはすでにローンチされている機能なので,近いうちにデバッグされると思います.そのときに odignore.txt を直接編集したものも機能するようになればいいですね.

5. ClientPolicy.ini

5.1. 手順

手順は以下のとおりです:

  1. C:\Users\%USERNAME%\AppData\Local\Microsoft\OneDrive\settings\Personal\ClientPolicy.ini を開く
  2. HighVisibilityFileExclusionList に除外したいフォルダ名を記述

5.2. 原理

ClientPolicy.ini はなんかいろいろ裏の設定が書かれているファイルです.このファイルに HighVisibilityFileExclusionList という項目があり,これに除外したいフォルダ名を記述することで,同期対象から除外することができます.ClientPolicy.ini をさっと見た感じ,| で区切ると複数個指定できるようです.また,.. から始まる項目はおそらくホワイトリストのようです.似たような項目に FilenameExclusionList というものもあります.こちらも同じような挙動を示しました.違いはよく分かっていません.

5.3. 問題点

問題点は以下のとおりです:

  • クライアントごとに設定が必要
  • 「同期の問題」として表示される
  • クライアントごとに設定が必要

6. NucleusUpdateRingConfig.jsonPreSignInSettingsConfig.json

6.1. 手順

OneDrive の設定ファイルのあるディレクトリを見ていると,ほかにも関係ありそうなファイルがありました:

  • C:\Users\%USERNAME%\AppData\Local\Microsoft\OneDrive\ListSync\settings\NucleusUpdateRingConfig.json
  • C:\Users\%USERNAME%\AppData\Local\Microsoft\OneDrive\settings\PreSignInSettingsConfig.json

これらをうまいこと編集すれば,ファイル・フォルダの除外ができるかもしれません.

6.2. 原理

OneDrive にはそもそも特定のファイルを同期対象から除外する機能がちゃんとあります.なぜなら,以下のようなシステムファイルを同期対象からちゃんと除外するからです:

  • .laccdb
  • *.tpm
  • thumbs.db
  • EhThumbs.db
  • Desktop.ini
  • .DS_Store
  • Icon\r
  • .lock

これの設定に関連していると思われるのが,先ほど挙げた NucleusUpdateRingConfig.jsonPreSignInSettingsConfig.json です.しかし,これらのファイルを編集してもファイル・フォルダの除外はできませんでした.PreSignInSettingsConfig.json については,OneDrive を起動すると自動的に上書きされてしまうようでした.

6.3. 問題点

問題点は以下のとおりです:

  • クライアントごとに設定が必要
  • 機能しない

7. まとめ

OneDrive において同期対象から除外するファイル・フォルダを設定する方法について紹介しました.結局ちゃんと機能する中でまだ楽なのは ClientPolicy.ini による方法ということになりそうです.わたしはここに node_modules を記述して除外することにしました.

展望としては,とりあえず「除外されたファイル拡張子」がちゃんと機能するようになったらいいですね.そうしたら,odignore.txt を直接編集することでファイル・フォルダの除外ができるようになるかもしれません.また,将来的には .gitignore のように .onedriveignore で共有するフォルダ内に配置したファイルで設定できるようになるといいですね.そうすれば,クライアントごとに設定する必要もなくなります.ああ,.gitignore みたいに除外設定できるクラウドストレージがあればいいのになあ.

8. 後日談

もともと除外したかったのは node_modules.venv だったのですが,これらは Dev Container の Volume トリックを利用することでうまく除外することができました.

GitHubで編集を提案

Discussion