発生した問題
MacBook Air (M2 2022)で、SourceTree(4.2.0)を使って差分を取得する際に、
git-lfs filter-process: git-lfs: command not found
というエラーが出て取得することができない。
SourceTreeを使った差分データの書き出しはこのあたりを参照
https://ics.media/entry/4475/
https://and-ha.com/coding/sourcetree-commit-diff/
ちなみに、SourceTree(4.2.0)において、上記設定中、設定>カスタムアクション のタブが
グレーアウトして編集できない問題は 以下参考に解決。英語に一度切り替えて設定。
それか、操作>カスタムアクション>編集 が動くかもしれない。
原因(と思われること)
SourceTreeが、git-lfsコマンドを参照できる場所にパスが通っていないため、エラーとなっている。
解決するために、パスを設定したいが
macOS 13(より以前でも、おそらくは11以降?)では、重要なコマンドが置かれている場所へのシンボリックリンクを設定することができない。そのため以下のようなコマンドを実行することができない。
sudo ln -s /usr/local/bin/git-lfs /usr/bin/
これを実行するとln: cannot create /usr/bin//git-lfs : Read-only file system
となって設定できない。
これを解決するのに、数個の記事を使ってなんとか解決したので、同様の問題がある場合に役立てて欲しい。
解決手順
参考にした記事
「macOS Big Sur 」でgit-lfs filter-process: git-lfs: command not foundに対応する
https://builtfunc.com/news/2220/
1 macOSのセキュリティ部分を3つ解除する
※幾つかのコメントにもありますが、この対応はmacOSが一般的な利用で操作できないようにしている部分を解除するやり方になるのでその点を理解した上で実施した方が良いと思います。
1) FileVault を無効にする (システム環境設定 → セキュリティとプライバシー → FileVault)
2) System Integrity Protection (SIP) を無効にして、Signed System Volume (SSV)も無効にする。
手順
まず、MacBookを終了させる。その後、電源ボタンを押し続けながら起動します。
「起動オプションを読み込み中」と表示されるまで、Macの電源ボタンを押したままにします。
画面にハードディスクのアイコンと、歯車の設定が選べるので、歯車の設定の方を選択します。
その後、自分のアイコンを選択して、パスワードを入れて進み、「ターミナル」を起動させる。
以下参照
https://blog.kabocy.com/repair-custom/3496/
csrutil disable
csrutil authenticated-root disable
reboot
1つめはちょっとだけ時間がかかる
再起動を行う。
ここまでで、暗号化の解除、SIP、SSVの解除が終了。
2 マウント用のディレクトリを作る
参考サイトに沿って対応。
1. マウント用のディレクトリを作成
% mkdir ~/mount
このmountはフォルダ名なので適当に決めてOK 以下mountとして解説
2. 「APFSシステムスナップショット」のデバイス名を控える
ディスクユーティリティ から 該当部分のデバイス名を控えておく。
この時、disk1s2s3 だった場合には、末尾のs3を取って disk1s2 とする。
3. ディレクトリにマウントする
% sudo mount -o nobrowse -t apfs /dev/disk3s1 ~/mount
この「disk3s1」は自分の控えたものに置き換える
4. git-lfsコマンドのシンボリックリンクを作成
私は、homebrewを使ってインストールしたので、type git-lfs
の結果
git-lfs is /opt/homebrew/bin/git-lfs
となっているので、
% sudo ln -s /opt/homebrew/bin/git-lfs ~/mount/usr/bin/
4. ルートデバイスとして登録
sudo bless --mount ~/mount/System/Library/CoreServices --setBoot --create-snapshot
ここが今回の最もハマった場所で、どの記事をみても
% sudo bless -folder ~/mount/System/Library/CoreServices --bootefi --create-snapshot
を実行としか書いてない。これを実行すると、
bless: The 'folder' option is only supported for external media on Apple Silicon devices.
となって Appleシリコンだとなんかダメぽい。詰んだかーーー!と思っていたら、上記の英語記事に救世主がいた。
どうやら、-folder
を--mountに
、--bootefi
を--setBoot
に変更することでプログラムを実行することができた。
5. 再起動
% sudo reboot
改めて、SourceTreeを開いて、差分を取ると、無事エラーもなく差分ファイルを取ることができた。
まとめ
新しいOSになって、容易にシンボリックリンクを登録することができなくなっている。
そもそもSourceTreeの設定に、git-lfsの使用場所を設定する部分があるのだが、そこを実際参照しているのかどうかが怪しい。いくつか切り替えてみたが、動作に差はなかった。
静的なWebサイトを更新する際の、SourceTreeでの差分抽出は非常に便利なのでこの機能がないと
普段の更新作業がとても難しいことになる。
しかしながら、この際SourceTree以外でも差分を取る方法も模索したのだが、diffとしての差分の視覚化ツールはあっても
具体的な差分ファイルを抜き出すアプリケーションはMacでは「scone Diff」 https://sconeapp.com/diff/
くらいで、あまり業界全体で差分ツールの需要がないところをみると、もうすでにローカルで開発したものをFTPで差分でサーバーにアップする運用自体が業界から無くなっているのかもしれないと思った。
その辺りも今後、知っていけたらと思う。