概要
Git for Windowsはデフォルトでシンボリックリンクが扱えないようになっています。しかしそれではUnix系OSとリポジトリを共有して開発する場合などで不便なため、Unix系OSと同等にシンボリックリンクを扱えるように設定します。
内容としては、↓の元ネタを整理・補足するようなものとなります。
- 元ネタ:Symbolic Links · git-for-windows/git Wiki
- 元ネタ2:Git for Windowsでのシンボリックリンク | OPC Diary ↑のページの日本語による解説
確認した環境
- Windows 10: build 14986.1001
- Git for Windows: 2.11.1.20170208
- Polsedit: 1.0.0.5
事前準備:一般ユーザにシンボリックリンクを作る権限を与える
Windowsでシンボリックリンクを作成するには管理者権限が必要なのですが、git clone
やln -s
を実行するためにわざわざ管理者権限を付与したくないですよね。
元ネタにあるように、グループポリシーエディタがあれば、SeCreateSymbolicLinkPrivilege
権限を一般ユーザに与えることによって、管理者権限不要でシンボリックリンクを作成することができるようになります。
しかし、グループポリシーエディタは、WindowsのProエディション以上にしか付属しておらず、おそらくほとんどの方が利用されているであろうHomeエディション以下には付属していないのです。
そこで、元ネタにはPolseditというフリーのローカルポリシーエディタのクローンが紹介されています。
これを使うことで上記の権限設定を行うことができます。
追記1:
@ubnt_intrepidさんのコメントにあるように、editrights
コマンドを用いてもSeCreateSymbolicLinkPrivilege
権限を一般ユーザに付与することができるようです。
追記2:
同@ubnt_intrepidさんのコメントにあるように、2017年3月に公開されると言われているWindows 10 Creators Updateでは、デフォルトの状態でも開発者モードにすることで管理者権限なしでシンボリックリンクが作成できるようになるようです。よって、Creators Update以降は、この節の作業は不要になりますね。 ただし、コメントにあるWindowsブログの記事によると、この変更自体はbuild 14972から提供されているのですが、管理者権限が不要になるのは、mklinkコマンドを使った場合と、CreateSymbolicLink APIを特別なフラグを付けて呼んだ場合だけのようです。git bashのlnコマンドはまだフラグに対応していないのか、この記事の作成時点で私が試した限りでは、管理者権限がなければシンボリックリンクが作成できませんでした。
(↑2017/03/05 22:59 開発者モードへの変更が必要なこと、lnコマンドにはまだ管理者権限が必要だったことを追記)
Polseditで一般ユーザにシンボリックリンク作成権限を付与する
Polseditのzipを展開し、polsedit.exeを実行してください。
実行には管理者権限が必要です。
1. Policy一覧からCreate symbolic links
を開く
画面の右ペインに編集可能なポリシーの一覧が表示されるので、その中からCreate symbolic links
ポリシーをダブルクリック等で開きます。
以下のようなダイアログが表示されます。
デフォルト状態では、Administratorsグループだけに権限が付与されています。
ここに、一般ユーザを表すUsersグループを追加することによって、一般ユーザでもシンボリックリンクを作成できるようにします。
2. Usersグループに権限を与える
Add User or Group...
ボタンをクリックすると、権限を与えるユーザとグループを選択するダイアログが表示されます。
私が試したところでは、初期状態ではこの一覧にはグループが表示されておらず、Object Types...
ボタンを押して表示されるダイアログでGroups
にもチェックを入れる必要がありました。
一覧からUsers
を選択し、OK
ボタンを押します。
最初のダイアログが以下のような状態になっていれば成功です。
設定を反映するために一度サインオフすることが求められるので、サインオフして再度サインインしましょう。
git clone
でリポジトリに含まれるシンボリックリンクを正しく再現できるようにする
Git for Windowsでgit clone
を行うと、デフォルトではリポジトリに含まれるシンボリックリンクが、リンク先を示す文字列が書かれたただのテキストファイルになってしまいます。
gitconfigのcore.symlinks
をtrue
に設定することで、リポジトリに含まれるシンボリックリンクがきちんとシンボリックリンクとして扱われるようになります。
元ネタでは、git clone
時にオプションを渡す方法を解説していますが、gitconfigを設定してしまったほうが便利だと思います。
$ git config --global core.symlinks true
git bashのln -s
コマンドでシンボリックリンクを作れるようにする
元ネタでは「ln -s
コマンドではファイルのコピーを作るようになっているので、mklink
コマンドを使ってね」とありますが、以下の設定をすればln -s
でもシンボリックリンクが作成できるようになります。
環境変数MSYS
にwinsymlinks:nativestrict
を設定する
MSYSでは上記見出しにあるような設定をすることで、Windowsネイティブのシンボリックリンクが作成できるようになります。git bashはMSYS由来の環境なので、同様の設定が有効のようです。
私はWindowsのユーザ環境変数に設定しましたが、システム環境変数やgit bashの環境変数に設定してもうまくいくと思います(未確認)。
Windowsの環境変数を設定する場合、コントロールパネルから環境変数のメニューを辿ってもいいのですが、setx
コマンドを使うと一発で環境変数をセットできるのでオススメです。
setx
コマンドを使ってユーザ環境変数へ上記設定を行うには以下のようにします。
> setx MSYS winsymlinks:nativestrict
参考:
- https://github.com/git-for-windows/git/issues/171
- http://appsweets.net/blog/2013/11/18/creating-ntfs-native-symbolic-link-in-cygwin/
シンボリックリンクをコミットしても大丈夫
前述の方法で作成したシンボリックリンクをリポジトリにコミットし、他のマシン(Windows, Linux)でgit clone
したところ、正しくシンボリックリンクとして取り出せることを確認しました。
これでWindowsでも安心してシンボリックリンクが使えますね。