Windowsでのシンボリックリンクのサポートの追加については、多くの質問がありました。しかし、Windowsで symlinksのあるリポジトリ をクローンすると実際に何が起こるのでしょうか?
ネイティブGitクライアントgit clone
およびgit init
の バージョン1.5. は、シンボリックリンクのサポートのためにターゲットファイルシステムをプローブし、それに応じてcore.symlinks
のローカルリポジトリ構成を設定します。つまり、FATまたはNTFSの場合はfalse
になります。 これにより、シンボリックリンクが作成およびコミットされます。 Linuxでは、Windowsでリンクテキストを含むプレーンテキストファイルとして表示されます(詳細については、 git config documentation on core.symlinks を参照してください)。
Git for Windowsバージョン2.10.2 にはインストーラーに シンボリックリンクサポートを有効にする明示的なオプション があります。
Git for Windowsの古いバージョンでは、core.symlinks
をtrue
に手動で設定できます。これにより、Gitは以下の制約の下でシンボリックリンクを作成できます。
SeCreateSymbolicLinkPrivilege
権限が必要です。詳細 詳細 はGit for Windows wikiで利用可能です。
古いバージョンのGit for Windowsでは、作業ツリーのクローンを作成してリセットした後、手動でcore.symlinks
を手動でtrue
に設定すると、次のようなエラーメッセージが表示されます。
$ git reset --hard HEAD
error: unable to create symlink directory (Function not implemented)
error: unable to create symlink linux-links/this_is_a_symbolic_link_to_file (Function not implemented)
fatal: Could not reset index file to revision 'HEAD'.
サイドノートとして、JGitクライアントはバージョン3.3までシンボリックリンクのサポートのためにターゲットファイルシステムをプローブしなかったので、core.symlinks
設定はシステム/グローバルGit構成が何であれフォールバックしていました。 バージョン3. から始まるJGitはシンボリックリンクのサポートをプローブしますが、保守的すぎるようで、core.symlinks = false
シンボリックリンクが実際にサポートされる場合がある)を設定します 。
https://github.com/sschuberth/git-playground をチェックアウトできます。これには、テスト用にLinuxで作成された多数のリンクが含まれています。
1つのソリューションには、Gitによって保存されたシンボリックリンクを検出し、Windowsシンボリックリンクに置き換えるためのフィルターがあります。
詳細は「 WindowsのGit Symlinks
しかし、真のシンボリックリンクのサポートは今のところだけではありません:
issue 224 および最新の(2012年7月) GitHubについての議論 (これを見た)を参照してください。
windowsのファイルシステムリンクには、ハードリンク、ジャンクション、およびシンボリックリンクの3種類があります。
- ハードリンクとジャンクションはNT以降で利用可能です。ハードリンクはファイルのみをポイントでき、ジャンクションはディレクトリ(同じボリューム上)のみをポイントできます。
- Vista以降に利用可能なシンボリックリンクは、異なるボリューム上のファイルまたはディレクトリを指すことができます。
mklink
はVista以降に出荷され、上記のすべてを作成できます。ただし、スクリプトで呼び出される方法により、シンボリックリンクのみが作成されます(Linuxシンボリックリンクに最も似ているので、これは良いことです)。Vistaより前のバージョンでは、「
fsutil hardlink
」を使用してファイルのハードリンクを作成するフォールバックが必要です(ただし、おそらく「-s
」なしで「ln」が呼び出される場合のみ)。 「fsutils reparsepoint
」、または単に元のln.exe
を呼び出します。
mklink
にはデフォルトで管理者権限が必要なため、Windows XPセットアップを壊すことに加えて、このような変更は標準のWindows 7セットアップも壊します。 これは、機能するかどうかを確認し、そのような場合はコピーに戻すことで修正できます。記録のためだけに:Git for Windows自体でシンボリックリンクをサポートしようと少し試してみましたが、Windows 7以降の「シンボリックサポート」はUnixシンボリックリンクをエミュレートするにはほとんど役に立たないと結論付けました。
「 オープンソース、Windows(およびジャンクションポイントライブラリ)用の100%互換ln) 」と主張するプロジェクトがありますが、
残念ながら、通常のユーザーには、Windowsでデフォルトでシンボリックリンクを作成するために必要な権限がありません。これを、POSIXが必要とするのと同じ方法でシンボリックリンクが指すものを変更できないという事実と組み合わせて、多かれ少なかれ役に立たないようにします。これはすでに上に書いた。
これで、著者は、これが私が気にするすべてに対して「100%互換」であると主張することができますが、ソースコードをざっと見てみると、そうではないことがわかります。フォールバックを提供せず、
CreateSymbolicLink
関数を動的にロードすることさえしません。そのため、非シンボリックリンク対応のWindowsバージョンでの結果は、シンボルが見つからないというエラーでクラッシュします。
私はここでmsysgitのSymlinkサポートに取り組んでいます:
https://github.com/frogonwheels/git (ブランチmrg/symlink-v * ..現在v2)
テストはnotを完了まで実行します。テストに取り組む時間は限られており、やる気を起こさせる本当の短期的な目標はありません。 msysgitの下でgit-annexのようなプロジェクトを使用できるようになれば嬉しいです。
私の仕事は、msysシェルにもシンボリックリンクのサポートがないために妨げられています。
Cygwin lnコマンドによって提案された特権を付与するためのコマンドラインがあります。 (これを管理者として実行する必要があります)。
editrights -a SeCreateSymbolicLinkPrivilege -a $ YOUR_USER
ディレクトリとファイルのシンボリックリンクの問題全体が大きな問題です。
現時点では、できる限り、ファイルシンボリックリンクを機能させることに限定しています... msysgitではディレクトリシンボリックリンクを許可していません。それは理想的ではありませんが、現実には、解決策は少し手間のかかるものであり、possixリンクとNTFS非互換の現実にpossixリンクを課そうとするのは苦痛です。
ターゲットがファイルなのかディレクトリなのかを試してみることはできますが、頭の一番上にあるいくつかの問題、特にエンティティが作成される順序の問題全体について考えることができます。