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