Scoop、レジストリファイルの扱いのせいで地獄を見る
これは何?
everything
パッケージなどに関連するレジストリファイルが、そのファイルの扱いでしくじったせいで scoop update
などに支障が出るようになった。
具体的には .reg が勝手に編集された扱いにされて commit を要求されるようになることで scoop update(実質的に当該 bucket のローカルリポジトリに対する git pull である)の実行に失敗する。
$ scoop update
Updating Scoop...
Updating 'extras' bucket...
error: Your local changes to the following files would be overwritten by merge:
scripts/everything/install-context.reg
scripts/everything/uninstall-context.reg
こんな具合で。
レジストリファイルのエンコードは UCS-2 LE BOM(いわゆる UTF-16 の一種)であることを強く推奨される。また行の終端も /r/n
であることが求められる。まあ、UTF-8 なんかでも動くらしいのだけど、regedit は UCS-2 LE BOM を吐くっぽいし、そうであるのがいいらしい。
今回 extras
が死んだのはよくわからない。scoop のお偉方も「この問題は見たことがない」とボヤいていた。
rashil2000 commented 12 days ago
Hmm, never faced this problem before. @tukanos could this be related to encoding?
しかし解決は何となく分かった。エンコードというよりは終端処理が問題だったように見える。次のコミットは(副次的に)このバグを修繕したように見えるものである。
install-context.reg
および uninstall-context.reg
の終端が(多分)/r
から /r/n
になっているように見える。このコミットもこのレジストリファイルの扱いをどうにかするのではなく全然別のことをしようとして、結果的に扱いも正しいものにしてしまったと捉えるのが妥当だと思われる。
私の見立てとしてはこうである: 正しくないフォーマットである .reg が git に吸われるたびに何らかの理由で Windows か何かに勝手に修正される。git のコミット上では正しくないフォーマットが正史であり、しかし Windows が勝手に直してしまうので冒頭の通り git pull に失敗する。
でもこの見立て、なんか違う気がする。私の見立ての打率はわずか1割であり、合っている方が少ない。まあ間違っているということがわかるということは、少なくとも正しい答えが出てくるということなので悪いことでもないと思うんだけど。
いかんせん私もレジストリファイルの扱いがそれなりにデリケートなものであるとは思ってもいなかったので、実際どうなのかよくわからない。scoop 本体側でもレジストリファイルの扱いをテストで検証するようにしようぜという旨のプルリクエストもある。状況を注視する必要がある。
備考
万が一今回の件が原因でぶっ壊れたと思われる場合、次の手続きで治るかもしれない。
$ scoop bucket rm extra
$ scoop bucket add extra
私の環境では治らなかったので、次のようにした。
- どうにかして scoop/buckets にたどり着く
-
/extras
を物理的に消す git clone https://github.com/ScoopInstaller/Extras.git extras
- ???
- Profit!
荒っぽいが、治った。
Discussion
ありがとうございます。同じ現象でなんだこれ?と思っていたのですが、おかげさまで解決しました(´▽`)