MacにsvnX(SVNクライアント)を入れて作業していたら想定外の挙動が発生し解決したのでメモ


はじめに

macのsvnXを利用していて突然Lockができなくなったとか、Commitしても無反応という方向けでかつ
brewでパッケージ管理をしている方向けの記事となります

背景

取引先のベンダー様がWindows環境で設計書を作成しSVNで設計書をデータ管理している。
私はMacを使って設計書をSVNから取得し必要に応じて更新をMacから行わなければならなくなった。
昔はWindows主流だった私も今の会社に入ってからオンリーMacになったので
WindowsではTortoiseSVNを使っていたなぁ・・とか思いながら
MacでSVNかよ・・・!
って思いながらも、FreeのsvnXを入れることに。

最初はsvnXをインストールし問題なく動いているように見えたが、突然SVNサーバ上のファイル編集(Lock→Edit→Commit)
がうまくいかなくなり途方にくれた。どうにか解決したので調べた事をメモしています。

問題の内容と調査

問題

ある日svn lockが突然動かなくなる

% svn lock バッチ設計.xlsx
svn: E155010: The node 'xxxxxxxxxxxxxxxxxxxxxxバッチ設計.xlsx' was not found.

あれ?って思って指定したファイルをフルパスとか、リポジトリ取り直しとかやったらLockがなんとなく動くようになったが
Commitができない!?という状態になった。

事象イメージ

1) 以下コマンドでLockを取得

svn lock バッチ設計.xlsx

2) ロックした対象ファイルをクリックして開いて編集

3) 以下コマンドでCommit

svn commit -m "修正しました。"

→ しかし無反応。

本来であれば

Sending        バッチ設計.xlsx
Transmitting file data .
Committed revision xxxx.

といった表示が出るのに・・

4) svn statusで確認すると以下のようになる

svn status
?       バッチ設計.xlsx
!    K  バッチ設計.xlsx

→ ? とか !とか表示されている。同じファイル名が2行表示される。なんだこれ?
どうやらファイル名が正しく認識していない状態?
そして K というのがLockを表すのだがLockはできているという矛盾。わけわからん。

5) svnX上でもみてみるとこんな感じになる。
この例は 設計書というフォルダの配下にバッチ設計とかのフォルダが存在するイメージ

これをみるとわかるようにsvnXが同じフォルダ名なのに二つ認識してしまっている。
!オレンジとか?とかコマンドでも発生しているような色々と意味不明な表示になっていることに今更きづく・・・

もともとmacにsvnXを入れて最初は正常に動いていたので妙な自信があり、原因がわからずハマってしまいました。

そしてググってもmacとsvnとかあんまり出てこない。

そもそもmacでSVNを使うという人が少ない。ニーズが低いのでしょうw

調査

色々と調べてたら以下記事を発見!ありがとうございます。
http://dackdive.hateblo.jp/entry/2016/02/10/191036

対象名称やパスに日本語の濁点が入るとうまくいかないutf8-mac問題というやつなんですねぇ・・知りませんでした。

という自分の無知さを改めて痛感。

ただ、こちらの記事ではsubversion17で、MacPortsの利用を前提としており、
私はbrewでパッケージ管理を行いたかったので別のサイトを検索。すると

以下記事を発見!ありがとうございます。
http://bhind13.com/info/2645/

おぉ!これだ!ということで、試してみる事に

私の環境

% sw_vers
ProductName:  Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G1611

% xcodebuild -version
Xcode 8.2.1
Build version 8C1002

% pyenv --version
pyenv 20160422

※pyenvはいれておかないと詰む可能性があるので注意です。入れておいた方がいいです

utf8-mac問題対策済のsvnをインストール

brew tap tholu/tap
brew install subversion18 -–with-unicode-path

すると

scons: *** SCons version 2.5.1 does not run under Python version 3.5.0.
Python 3 is not yet supported.

Python3は対応していません。ということで、以下を実施

pyenv install 2.7.11
pyenv global 2.7.11
python --version

念のためターミナルを起動しなおし、再度以下を実行

brew tap tholu/tap
brew install subversion18 -–with-unicode-path

無事インストール完了!

ただ、これだけではsvnXとの連動ができないので、続いてsvnXと連動させます。

utf8-mac問題解消済svnコマンドをsvnXと連動させます

1) svnX起動

2) メニューから設定情報を確認(svnのbinのPathを探す)
svnX -> Preferences -> General -> svn binary folder

入力されているPathを確認

3) 対象ディレクトリへ移動(私の環境は以下のPathでした)

cd /Applications/Xcode.app/Contents/Developer/usr/bin

4) 既存のXcodeに存在するsvnコマンドの存在を確認

ls -trl svn
-rwxr-xr-x  1 root  wheel  297792 Dec 16  2016 svn

5) 既存のXcodeに存在するsvnコマンドを退避

mv svn svn.backup
mv: rename svn to svn.backup: Permission denied

sudoを忘れて実行しちゃうとこうなります ということでsudoして再度実行

sudo mv ./svn ./svn.backup

ls -trl svn*

-rwxr-xr-x  1 root  wheel   61696 Dec 16  2016 svnmucc
-rwxr-xr-x  1 root  wheel   36256 Dec 16  2016 svnversion
-rwxr-xr-x  1 root  wheel   93872 Dec 16  2016 svnbench
-rwxr-xr-x  1 root  wheel  105968 Dec 16  2016 svnadmin
-rwxr-xr-x  1 root  wheel  297792 Dec 16  2016 svn.backup  <ーーー退避されたのがこれ
-rwxr-xr-x  1 root  wheel   82752 Dec 16  2016 svnsync
-rwxr-xr-x  1 root  wheel   56960 Dec 16  2016 svndumpfilter
-rwxr-xr-x  1 root  wheel   81904 Dec 16  2016 svnrdump
-rwxr-xr-x  1 root  wheel  104592 Dec 16  2016 svnserve
-rwxr-xr-x  1 root  wheel   63456 Dec 16  2016 svnfsfs
-rwxr-xr-x  1 root  wheel   90160 Dec 16  2016 svnlook

6) svnversion18 --with-unicode-pathでインストール済みのsvnのパスを指定する

% sudo ln -s /usr/local/bin/svn ./svn

※事前にbinのパスはwhichで確認しておくことが必要です。私の場合svnversion18は /usr/local/bin/svn に格納されていました。

7) svnコマンド確認

% ls -trl svn*
-rwxr-xr-x  1 root  wheel   61696 Dec 16  2016 svnmucc
-rwxr-xr-x  1 root  wheel   36256 Dec 16  2016 svnversion
-rwxr-xr-x  1 root  wheel   93872 Dec 16  2016 svnbench
-rwxr-xr-x  1 root  wheel  105968 Dec 16  2016 svnadmin
-rwxr-xr-x  1 root  wheel  297792 Dec 16  2016 svn.backup
-rwxr-xr-x  1 root  wheel   82752 Dec 16  2016 svnsync
-rwxr-xr-x  1 root  wheel   56960 Dec 16  2016 svndumpfilter
-rwxr-xr-x  1 root  wheel   81904 Dec 16  2016 svnrdump
-rwxr-xr-x  1 root  wheel  104592 Dec 16  2016 svnserve
-rwxr-xr-x  1 root  wheel   63456 Dec 16  2016 svnfsfs
-rwxr-xr-x  1 root  wheel   90160 Dec 16  2016 svnlook
lrwxr-xr-x  1 root  wheel      18 Sep 15 10:42 svn -> /usr/local/bin/svn <ーーー置き換えたのがこれ

8) svnXを再起動

9) svnXの画面にて確認すると変なオレンジが消えた!

イメージ図は色々と塗りつぶしてますがオレンジとかの表示がなくなったのがわかりますね。

これで濁点付きのファイルでも、Lock→Edit→Commitが無事svnXでできるようになりましたので

  1. 編集したいファイルをsvnX上で右クリックして"Lock"
  2. ファイルを編集
  3. "Refresh"ボタンを押してsvnX上の画面を再表示
  4. 右上にある"Commit”ボタンを押すとコメント入力欄が起動

※もし編集間違えてして行ってしまったり、Conflictとか発生しちゃっても真ん中にある"Revert"を押せば元通りです。

macでもsvnXでそれなりに快適にSVNクライアントとして活用できるということを実感!!

おまけ

最初の記事を勘違いし
subversionの最新版でやればいいんだろうと勝手に思い以下コマンドを実行したらbrew installが成功してしまうが
utf8-mac問題は全く解消されずさらに混乱しました。

brew install subversion --unicode-path

→ エラーにならない!なんでだよ!

brew installでは存在しないオプションとかを指定してもエラーにならない!?みたい。

以下 brew info で確認しても --unicode-path というオプションはありません。そりゃそうだ

% brew info subversion
subversion: stable 1.9.7 (bottled)
Version control system designed to be a better CVS
https://subversion.apache.org/
/usr/local/Cellar/subversion/1.9.7 (203 files, 22.3MB) *
  Poured from bottle on 2017-09-15 at 09:35:25
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/subversion.rb
==> Dependencies
Build: pkg-config ✔, swig ✘, scons ✔
Required: apr-util ✔, apr ✔, sqlite ✔, openssl ✔
Optional: gpg-agent ✘
==> Requirements
Recommended: perl >= 5.6 ✔
Optional: python ✘, java ✔
==> Options
--with-gpg-agent
  Build with support for GPG Agent
--with-java
  Build Java bindings
--with-python
  Build with python support
--without-perl
  Build without Perl bindings
--without-ruby
  Build without Ruby bindings
==> Caveats
svntools have been installed to:
  /usr/local/opt/subversion/libexec

The perl bindings are located in various subdirectories of:
  /usr/local/opt/subversion/lib/perl5

If you wish to use the Ruby bindings you may need to add:
  /usr/local/lib/ruby
to your RUBYLIB.

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

subversion18の --with-unicode-path が存在するか念のため確認

% brew info subversion18
tholu/tap/subversion18: stable 1.8.16 (bottled)
Version control system
https://subversion.apache.org/
Not installed
From: https://github.com/tholu/homebrew-tap/blob/master/subversion18.rb
==> Dependencies
Build: pkg-config ✔, apr-util ✔, scons ✔
Required: sqlite ✔, openssl ✔
Optional: gpg-agent ✘
==> Requirements
Optional: python ✘, java ✔
==> Options
--universal
  Build a universal binary
--with-gpg-agent
  Build with support for GPG Agent
--with-java
  Build Java bindings
--with-perl
  Build Perl bindings
--with-python
  Build with python support
--with-ruby
  Build Ruby bindings
--with-unicode-path                                                                      <ーーこれ
  Build with support for OS X UTF-8-MAC filename
==> Caveats
svntools have been installed to:
  /usr/local/opt/subversion18/libexec

ということでbrew installのコマンドはオプションとかのtypoを注意して打たないとダメですね。と思いました。