web-dev-qa-db-ja.com

Windowsでシンボリックリンクを使用してリポジトリを複製するとどうなりますか?

Windowsでのシンボリックリンクのサポートの追加については、多くの質問がありました。しかし、Windowsで symlinksのあるリポジトリ をクローンすると実際に何が起こるのでしょうか?

50
Andres Riofrio

ネイティブ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.symlinkstrueに手動で設定できます。これにより、Gitは以下の制約の下でシンボリックリンクを作成できます。

  • シンボリックリンクは、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. から始まるJGitはシンボリックリンクのサポートをプローブしますが、保守的すぎるようで、core.symlinks = falseシンボリックリンクが実際にサポートされる場合がある)を設定します

https://github.com/sschuberth/git-playground をチェックアウトできます。これには、テスト用にLinuxで作成された多数のリンクが含まれています。

48
sschuberth

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バージョンでの結果は、シンボルが見つからないというエラーでクラッシュします。

11
VonC

私はここで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リンクを課そうとするのは苦痛です。

ターゲットがファイルなのかディレクトリなのかを試してみることはできますが、頭の一番上にあるいくつかの問題、特にエンティティが作成される順序の問題全体について考えることができます。

9
frogonwheels