cygwinはWindows上で作成されたファイルを全て755の実行可能ファイルとして扱ってしまうので、そのままgitで扱うとすべてのファイルが実行可能権限を持ったなんとも危なっかしい構成になってしまいます。

対策

filemodeの変更を無視するように設定しておきましょう。

参考

Windows Git users: Please check your core.fileMode setting – Google グループ


何故動かないか結構困ったのでメモ。

動かないもの

cygwin 環境、というかcmd.execygwinの中のfindコマンドを呼び出してるとこれはエラーになっちゃいます。

理由

何故ならfind\;\;をエスケープする役割なので、当然ここにはエスケープキャラクターを入れて置かなければならないわけですが、Windowsのcmdにおいて\はパス区切りであって何もエスケープしてくれません。

なのでcygwinfindcmd.exenyaosなどのWindows環境のシェルから使うときはcmd.exeのエスケープキャラクターの^を使ってこんなふうに書きましょう。

もしくはどちらの環境でも使える方法の

を使うのもいいかもしれません。


今まではcygwinをインストールしたディレクトリを全部SugarSyncで同期して使ってたんだけど、
よくわからないままに色々入れてたら700MBぐらいあったので整理整頓することにしました。

どうするか?

既にインストールされてるcygwinのファイルを整理するのはめんどくさかったの新規インストールをすることにしたのはいいけど、何せパッケージ選択がめんどくさい。めんどくさいっていうか手動でやると必ず忘れてしまうので自動化したい。

そこでコマンドラインインストールの登場です!

インストール方法

これでホームディレクトリ直下の C:\Users\ironsand\cygとかにインストールされる。

やめたパッケージ

gccとか入れてcygwinでコンパイルして色々してると毎回ドツボにハマるので、もうそういうのはVirtualBox上のUbuntuですることにする。

rubypythonはWindowsのネイティブパッケージを使う。結局なんだかんだでそれが一番安定してる気がするので。

gitcygwin用のパス名周りのエラーが鬱陶しくなることがちょくちょくあったのでChocolatey使ってcinst gitでインストールする方法に変更。

注意点

何故か 64bit バージョンは動きませんでした。理由はわかりませんが、こういう関係のソフトは32bit版のほうが今はまだ安定してる気がするし大量にメモリ使うこともないので気にしないことにします。

sshだとsshコマンドはインストールされないのでopensshを指定しましょう。

インストール後に/etc/passwdのホームディレクトリ設定を/home/usernameからcygdrive/c/Users/usernameとWindowsのホームフォルダに変更しておくとsshとかのコマンドの時に設定ファイルを自動的に読みに行ってくれるので便利。便利というかしないとちゃんと動かない。

あと環境変数にset HOME=%USERPROFILE%もどこかに仕込んでたほうが良いかも。

Util-Linux

何故かカレンダー表示のcalコマンドが見つからなかったので探してみたら、calのみのインストールはないらしい。
とりあえずutil-linuxが良さそうなんでこれを使う事にした。

tree

Windows由来のコマンドなのにWindowsのtreeコマンドは階層指定もできない残念仕様なのでcygwinのを入れました。tree -L 2とかで階層指定できる。便利!


cygwinでちゃんとHOMEの環境変数を設定してるのに ~/.bash_profileが読み込まれなかったのでその時の対処法。

問題点

結局問題だったのはbashを立ち上げた時に出てくるこのエラーメッセージを無視してたのが原因でした。

Your group is currently “mkpasswd”.

This indicates that your gid is not in /etc/group and your uid is not in /etc/passwd.

The /etc/passwd (and possibly /etc/group) files should be rebuilt. See the man pages for mkpasswd and mkgroup then, for example, run

mkpasswd -l [-d] > /etc/passwd
mkgroup -l [-d] > /etc/group

Note that the -d switch is necessary for domain users.

/etc/passwd を確認してみると、確かに今使ってるWindowsでのユーザ名が表示されていない。いつもcygwinのフォルダは上書きし続けて使ってるのでインストール時に既に /etc/passwd があった場合に自動更新されないみたいですね。

指示通りに
mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group

すると.bash_profileを読み込むようになりました。

HOMEの設定方法

ちなみにHOMEの設定方法は

HOME from the Windows environment, translated to POSIX form.

The entry in /etc/passwd

/home/USERNAME

When using Cygwin from the network (telnet, ssh,…), HOME is set from /etc/passwd.

cygwin FAQ
にあるように

1. Windowsの環境変数HOME
2. /etc/passwd にある記述
3. /home/USERNAME
4. ただし telnet,sshとかのネットワーク経由の場合は /etc/passwd が優先される

とのことです。

このときcygdrive外のフォルダを指定するには Windowsの環境変数に /cygdrive/c/ などから始まる記述を行います。

自分の場合はDropboxの直下にhomeフォルダを作り、それを複数環境で共有してるので
/cygdrive/p/dropbox/home とHOMEに設定しています。

参考

Dropbox » Webserviceを使っていこう
http://webservice.ironsand.net/category/dropbox/