漏洩には気をつけろ!
Subversion がファイルのテキストかバイナリかを判断する際のバグ(?)に遭遇。
漏洩には気をつけろ!
以上を記述しただけのファイルを仮に leak.txt として任意リポジトリのワーキングコピー配下に保存。
該当リポジトリに追加する。
$ svn add leak.txt A (bin) leak.txt
ちょwwwおまwwww
なんでバイナリなの?
文脈マージが可能かどうかを決めるのに、Subversion は svn:mime-type属性を調べます。もしファイルが svn:mime-type属性を持たないか、テキストを示すような内容であれば(たとえば、text/*)、Subversion はそれをテキストであると判断します。それ以外の場合、ファイルはバイナリであるとみなされます。Subversion はsvn import とsvn add 実行時に、バイナリ検出アルゴリズムを実行することでユーザを助けます。これらのコマンドは、良い推測を行い、(可能なら)バイナリのsvn:mime-type 属性を追加されるファイルに設定します。(もし Subversion の推測が間違っていた場合は、ユーザはいつでも手でその属性を削除することができます)
上述の内容から、
leak.txt のsvn:mime-type属性を調べてみる。
$ svn propget svn:mime-type leak.txt application/octet-stream
・・・とにかく Subversion が leak.txt をバイナリデータとしてみなしていることは明白。
理由はわからんが、このままでは気持ち悪い。
こう、
なんか、
バイト中、小学生に
「あのヒト髪型変!!」
と大声で言われてもなお、
笑顔でいたあの頃の自分くらい気持ち悪い。
svn diffも取れないし。
で、
ひとまず対処療法。
「Subversion によるバージョン管理::バイナリファイルと変換」の内容にあるとおり
この svn:mime-type 属性を手で変えてやりましょう。
$ svn propset svn:mime-type text/plain leak.txt property 'svn:mime-type' set on 'leak.txt' $ svn propget svn:mime-type leak.txt text/plain
これで悲劇の leak.txt のテキスト化が高らかに宣言されました。
もしくは、
$ svn propdel svn:mime-type leak.txt $ svn propget svn:mime-type leak.txt $
これで svn:mime-type 属性を消しちゃっても svn diff を取ることができるようになります。
ちなみに、
洩に
だけで Subversionがバイナリと判断することが判明。
なぜか?
その理由はあなたが解き明かしてください!