![Unison でサブディレクトリ以外のすべてのファイルを無視するにはどうすればよいでしょうか?](https://rvso.com/image/1568326/Unison%20%E3%81%A7%E3%82%B5%E3%83%96%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%BB%A5%E5%A4%96%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%84%A1%E8%A6%96%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
特定のルートのすべてのサブディレクトリの内容を同期したいのですが、ルート自体にはいくつかのファイルのみを同期したいです。そのためには、ディレクティブを使用してすべてのファイルを無視し (ignore
すべてのサブディレクトリを保持)、ディレクティブを使用して保持したいいくつかのファイルを再度追加したいと思いますignorenot
。そのために、次の 2 つのことを試しました。
ignore = Regex ^(?!.*\/).*$
プロファイルに追加して、ルート内のスラッシュを含むエントリを除外する正規表現を追加します。ただし、これにより、次のようなエラー メッセージが表示されますが、それ以上の説明はありません。Malformed pattern "Regex ^(?!.*\/).*$"."
まず ですべてを無視し
ignore = Name ?*
、次に でスラッシュを含むすべてのパスを再度追加しましたがignorenot = Path */*
、ディレクトリを無視しないとこの方法では機能しないため、期待どおりには機能しませんでした。
非常に単純な問題のようですが、理解できません。
答え1
どうやら、あなたが望むことを正確に行うことはできないようです。Unison がファイルとディレクトリを同期する場合、Unison は両者の違いを認識できますが、Unison はそれらを異なる方法で参照しません (たとえば、/
ディレクトリに をプレフィックスとして付けるなど)。そのため、ユーザーはどちらか一方に対してパターン マッチを実行できます。たとえば、 という名前のディレクトリと、ルートdeer
という名前のファイルを同期する場合、Unison はそれらを次のように名前付けします。phil
ROOT
new dir ----> ROOT/deer
new file ----> ROOT/phil
ROOT/deer
とを区別することはできませんROOT/phil
。ただし、いくつか提案があります。
path = deer
プロファイルに各ディレクトリの行を追加して、同期するディレクトリを手動で指定します。これはUnisonを構成する標準的な方法だと思います。次に、ルートディレクトリ内の同期したいファイル(たとえば、 という名前のファイル)を次のように同期されるディレクトリにphil
移動し、 を追加します。phil
deer/synced-root-files/
シンボリックリンクそのファイルからルートディレクトリに戻るcd ROOT; ln -s ROOT/deer/synced-root-files/phil
ルートディレクトリにパターンマッチできる命名規則を作りましょう。例えば、必要なファイルのみに名前を付けます。しないのようなものを同期したいので
ignore.phil
、Unison プロファイルに行を追加しますignore = Path ignore.*
。
こちらのリンクからパス指定そしてパスを無視する将来の読者が簡単に見つけられるように、Unison マニュアルのセクションをコピーします。