【まとめ】cygwinを使ってWindowsでgit cloneするとアクセス権周りでバッチが実行できない等の問題が起こる件についての最終考察


概要

下記3つの問題についてのまとめ。

http://qiita.com/umiai/items/7564fa745b205171268a
http://qiita.com/umiai/items/ffb0de687e4383b823c4
http://qiita.com/umiai/items/aeb9eb7446e6897158fd

あらすじ

昨日cygwinが入った環境でgit cloneし、そこにあるバッチファイルで環境をセットアップしようとした。
しかしバッチファイルを叩くと
「指定されたデバイス、パスまたはファイルにアクセスできません。アクセス許可がない可能性があります。」
というエラーが出て実行できない。

開発環境の構築はリポジトリ内のsetup.batに任せていた為これが叩けないと環境が構築できなくて詰まった。

詳細は
http://qiita.com/umiai/items/7564fa745b205171268a
通りだが、

  • git clone後のバッチファイルは何もしていない状態では叩けない
  • git clone後のバッチファイルはエクスプローラの権限変更でも叩けない
  • git clone後のバッチファイルはchmod 777すると叩ける
  • git clone後のバッチファイルは管理者実行では叩ける

この挙動についてどうも腑に落ちないので色々と考察してみた。

そもそも通常はchmodなんて実行できない

問題解決の糸口が見つかったのはここで、別のcygwinが入っているPCでこの問題に対応しようとしたところ、
そもそもchmodが実行できないので
http://qiita.com/umiai/items/aeb9eb7446e6897158fd
の方法で解決しなかった。

ここでやっと気づいたのがcygwinのls等のコマンドをコマンドプロンプトでも使えるようにする為に
環境変数のPathにcygwinのbinを追加していたのだ。

全てを察した人はここでブラウザを閉じても良いかもしれない。
そう、残念なくらい馬鹿だったのだ・・・

cygwinの権限管理はどうなっている?

「git cloneしたバッチファイルが叩けない」
というのが今回の問題なわけだが、エラーや対処の為に試した方法と結果からみるに間違いなく権限周りの問題。
しかしそれにしては腑に落ちないのがエクスプローラからの権限変更では対処できないのに
chmodで権限変更すれば対処できるという点だ。

これに関しては予測しか立てられないので正しい情報を知っている人が居たらコメントしてくれると嬉しいのだが、
仮にcygwinはWindowsのアカウントの仕様を利用してcygwin上でUNIXのアクセス権限を実装していると仮定する。

先ずgit cloneすると作成されたファイルはcygwinのアカウントで作成された扱いになる。
これは実行されたgitがcygwin側のgitであった為だ。

この状態では自分のPCであろうと作成されたバッチは自分のアカウントで作成したものではないので、
作成されたバッチファイルの実行権限が自分のアカウントにはついていない。(これは確認済み)

エクスプローラーからサブディレクトリ含む全ファイルの権限変更を行っても権限が変更できなかったのは
単純に自分のアカウントとは別のアカウントで作成されたファイルだったから変更できなかっただけと思われる。

cygwin管理のアクセス権の変更はchmodから可能なので、
その後chmod -R 777 *で全ファイルの権限を変更すれば、
Windows OS側のcygwinのアカウントの権限が、誰でも実行可能となる為実行できるようになったのではと考えれば一応納得いく。

コマンドプロンプトだろうとcygwin側のgitやperlが実行されていた

ActivePerlとcygwinが両方インストールされていたとしても通常はコマンドプロンプトから実行できるperlはActivePerl側のもの。

でも少し言及したが実際にはcygwinのbinのパスが通ってなければ競合することは無い。
今回このPCではcygwinのbinのパスが通ってたのでcygwin側のperlが実行される可能性があった。

気になるのは自分の作成したperlスクリプトはActivePerlで実行されるのに対し、
git cloneによりcygwin側のアカウントで管理されたperlスクリプトはcygwinのperlで実行される点。

これはcygwin側管理のアカウントのファイルの関連付けがそうなっていたからではと考える。

でレジストリを削除してもバッチファイルがシェル上、というよりcygwin上で動作してしまったのも、
単純にアカウントが異なる為に自分のアカウントのレジストリキーを削除しても意味が無かったとすれば一応納得いく。

パスがUNIX形式に変換される

ちゃんとは見ていないがcygwin側で実行されたperlに渡るパスが、
この状態でのPCではUNIX形式に変換されるというのが結果論だがそうなっていたのでそうなっているとしか言いようが無い・・・

結局どうすれば良いのか

cygwinのbinへのパスを環境変数のPathから削除する。
実際に削除したら普通にまともに動作した(もう、どうでもいいんじゃないかな・・・)。

最後に

この考察は殆どが予想と結果論のみで構成されており解説として見るには不適切な箇所が多い。
正しい情報と見ず何か問題が起きた時「そういやこんなこと言ってた人が居たな」程度で見て欲しい。