tag:crieit.net,2005:https://crieit.net/tags/OneDrive/feed
「OneDrive」の記事 - Crieit
Crieitでタグ「OneDrive」に投稿された最近の記事
2023-02-01T00:00:20+09:00
https://crieit.net/tags/OneDrive/feed
tag:crieit.net,2005:PublicArticle/18380
2023-01-31T23:59:28+09:00
2023-02-01T00:00:20+09:00
https://crieit.net/posts/Git-OneDrive
Git と OneDrive 等のクラウドストレージを併用する
<p>ブログに書きたいネタとか雑多なメモを管理する際、Git によるバージョン管理と、クラウドストレージによる同期を併用したくなる。</p>
<p>具体的には、こんなことがしたい:</p>
<ul>
<li>コミットに至らないメモ書きの段階では、クラウドストレージで同期させたい
<ul>
<li>ついでにそのメモ書きは、タブレット等の複数の端末から更新したい</li>
</ul></li>
<li>ブログで記事を公開してからの差分を Git で管理</li>
</ul>
<p>プライベートのリモートリポジトリ代わりに、ベアリポジトリを OneDrive に共有する話は見たことある (<a target="_blank" rel="nofollow noopener" href="https://www.mussyu1204.com/wordpress/it/?p=249">これ</a> とか <a target="_blank" rel="nofollow noopener" href="https://note.com/ume_white/n/n825adeb8e04d">これ</a>) のだが、私がやりたいこととはちょっと違うんだよな。<br />
そもそも、 Microsoft 買収後に GitHub で無制限にプライベートリポジトリ作れるようになったので、 Git リポジトリの共有自体は GitHub とかで良いので。</p>
<p>以前、ローカルリポジトリをまるごと OneDrive で共有させてみたのだが、複数の端末で編集すると同期の競合が発生しまくってしまった。<br />
特に <code>.\.git</code> ディレクトリ内でコンフリクトすると後処理が面倒くさすぎる。</p>
<p>どうにかならんもんか。</p>
<h2><code>.\.git</code> ディレクトリだけ同期除外</h2>
<p>先に答えを言ってしまうと、クラウドストレージでの同期で特定のディレクトリの同期を除外させれば良い。</p>
<p><code>.\.git</code> ディレクトリ内のコンフリクトが面倒なら、 <code>.\.git</code> ディレクトリだけ同期を除外させればいじゃない… という精神だ。</p>
<p>ただ、 OneDrive では一筋縄ではいかなかったので、少々トリッキーな方法を採っている。</p>
<p>そのやり方を、 Windows 上の OneDrive を例に紹介する。</p>
<h3 id="1つ目の端末"><a href="#1%E3%81%A4%E7%9B%AE%E3%81%AE%E7%AB%AF%E6%9C%AB">1つ目の端末</a></h3>
<p>既に OneDrive で管理しているフォルダを、 Git 管理させる方法。</p>
<ol>
<li>同期させたいディレクトリのルート直下に <code>.\.git</code> フォルダを手動で新規作成する<br />
<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-01.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-01.png" alt="" /></a></li>
<li>OneDrive の設定から、 アカウント → フォルダの選択 から、 <code>.\.git</code> フォルダーを同期の対象外にする<br />
<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-02.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-02-244x300.png" alt="" /></a> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-03.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-03-300x272.png" alt="" /></a>
<ul>
<li>ローカルから <code>.\.git</code> フォルダが消える</li>
</ul></li>
<li><code>git init</code> する
<ul>
<li><code>.\.git</code> 隠しフォルダが再作成される</li>
</ul></li>
<li>適当に Git のコミットしたり、 remote の追加・プッシュしたりする</li>
</ol>
<p>この結果、 Git のリポジトリやステージングのデータを除く、ワーキングツリーのファイルだけをクラウドストレージで同期できる。</p>
<p>難点なのが、 OneDrive 上で「同期の問題」として以下のエラーが出続けることだ。<br />
<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-04.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-04.png" alt="" /></a></p>
<blockquote>
<p>この名前のファイルまたはフォルダーが、同じ場所にあります。<br />
両方のバージョンを残すには、この PCまたはオンラインのどちらかでこのアイテムの名前を変更してください。両方のアイテムが同じ場合は、この PCにあるバージョンを削除するとオンラインのバージョンをダウンロードできます。</p>
</blockquote>
<p>なお、エラーが出ていても同期はされる。</p>
<h3 id="2つ目の端末"><a href="#2%E3%81%A4%E7%9B%AE%E3%81%AE%E7%AB%AF%E6%9C%AB">2つ目の端末</a></h3>
<p>上記と同様、 OneDrive でワーキングツリーを同期させつつ、 <code>.\.git</code> ディレクトリは同期させないフォルダを、別のマシンに構築する方法。</p>
<ol>
<li>一旦、対象ディレクトリを「このデバイス上で常に保持する」を実行して、ファイルをローカルにおいておく</li>
<li>OneDrive の設定から、 アカウント → フォルダの選択 から、 <code>.\.git</code> フォルダーを同期の対象外にする
<ul>
<li>1つ目の端末の設定で、既に空の <code>.\.git</code> フォルダが存在しているはず</li>
<li>設定後ローカルから <code>.\.git</code> フォルダが消える</li>
</ul></li>
<li>同期を一時停止</li>
<li><p>clone の替わりに fetch と reset を使い、ワーキングツリーはそのままリポジトリだけ更新する</p>
<pre><code class="shell">$ git init
$ git remote add origin [email protected]:username/reponame.git
$ git fetch origin master
$ git reset origin/master
</code></pre></li>
<li><p>同期を再開させる</p></li>
</ol>
<h2 id="リポジトリの同期"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8C%E6%9C%9F">リポジトリの同期</a></h2>
<p>片方で push した後もう一方で pull しようとしても、先に OneDrive の同期によってワーキングツリーのファイルが更新されてしまっているので、 pull がエラーになってしまう。</p>
<p>こればかりはどうしようもないので、2つ目の端末のセットアップと同様、以下のように <strong>ワークツリーを維持したまま、</strong> リポジトリとステージングを (<code>--mixed</code> オプション相当で) リセットしてやれば良い。</p>
<pre><code>$ git fetch origin master
$ git reset origin/master
</code></pre>
<p>こんな感じで、期待していた環境が整った。</p>
<p>Android からは Jota+ あたりを使って OneDrive 上のファイルを直接更新したりしながら活用している。</p>
<h2 id="【参考】: OneDrive で特定のファイル名パターンのファイルをアップロードから除外する方法"><a href="#%E3%80%90%E5%8F%82%E8%80%83%E3%80%91%3A+OneDrive+%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95">【参考】: OneDrive で特定のファイル名パターンのファイルをアップロードから除外する方法</a></h2>
<p>ちなみに、グループポリシーやレジストリをいじることで、「特定の種類のファイルをアップロードから除外」する事ができる (<a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/sharepoint/use-group-policy#exclude-specific-kinds-of-files-from-being-uploaded">OneDrive ポリシーを使用して同期設定を制御する - SharePoint in Microsoft 365 | Microsoft Learn</a>)。<br />
<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-05.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-05.png" alt="" /></a></p>
<p>が、残念ながらフォルダに対してはこの機能が働かないので、上記の用途を満たさない。</p>
<p>参考までに、やり方だけ下記に示しておく。</p>
<h3 id="レジストリを弄る場合:"><a href="#%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%82%92%E5%BC%84%E3%82%8B%E5%A0%B4%E5%90%88%3A">レジストリを弄る場合:</a></h3>
<ol>
<li><code>HKLM\SOFTWARE\Policies\Microsoft\OneDrive\</code> の下に <code>EnableODIgnoreListFromGPO</code> というキーを作る<br />
<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-06.png"><img src="https://aquasoftware.net/blog/wp-content/uploads/2023/01/onedrive-git-together-06.png" alt="" /></a></li>
<li>その中に「除外したいファイル名」を名前と値の両方に持った、文字列値(複数可)を入れる</li>
<li>PC を再起動する</li>
</ol>
<h3 id="グループポリシーを使う場合:"><a href="#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%3A">グループポリシーを使う場合:</a></h3>
<ol>
<li>「グループ ポリシーの編集」を使える状態にする
<ul>
<li>Windows の Pro エディション以上なら標準では言っている。 Home エディションなら、ググって調べて。</li>
</ul></li>
<li><code>C:\Users\N2633\AppData\Local\Microsoft\OneDrive\<ビルド番号>\adm\</code> 内の以下のファイルをコピーする
<ul>
<li><code>.\OneDrive.admx</code> を <code>C:\Windows\PolicyDefinitions\</code> へ</li>
<li><code>.\ja\OneDrive.adml</code> <code>を C:\Windows\PolicyDefinitions\ja-JP\</code> へ</li>
</ul></li>
<li>Win+R で <code>gpedit.msc</code> を入力し「ローカル グループ ポリシー エディター」を立ち上げる</li>
<li>[コンピューターの構成] → [管理用テンプレート] → [OneDrive] → [特定の種類のファイルをアップロードから除外] を選択</li>
<li>構成を有効にして、キーワード一覧に除外したいファイル名(アスタリスク可)を設定する</li>
</ol>
advanceboy