無料のソースコード管理 (SCM: software configuration management) ソフト Git for Windows を用いて、GitHub で公開されているシンボリックリンクを含むリポジトリを、 git clone コマンドを使ってローカルに複製する手順を紹介します。
Windows 版の Git でシンボリックリンクに対応するための設定や、複製したシンボリックリンクの注意点についても紹介します。
見出しの最初に NG と書かれている章は、失敗例であり、シンボリックリンクを含むリポジトリから複製できなかった際の原因を紹介しています
シンボリックリンクを含むリポジトリを複製する手順については、最後の成功例の章だけを読んでも構いません。

※Git-2.49.0 (64 bit) を使用します。
※例として GitHub で公開されている denismm/dmmlib リポジトリを clone で複製します。
Git for Windows のインストール
Git for Windows のインストールは以下の記事を参照してください。
NG:Git for Windows はシンボリックリンクにデフォルトでは未対応
Git for Windows の場合、デフォルトでは、シンボリックリンクに対応しません。
この章での手順は、シンボリックリンクを取得できないNGパターンです。
下図は、 GitHub で公開されている denismm/dmmlib のシンボリックリンクのファイル lines.ps の内容です。
lines.ps は Symbolic Link であり、参照先の相対パス lines/lines.ps だけが記述されていて、その相対パスを指しているだけで、実体はありません。

試しに、 GitHub で公開されている denismm/dmmlib のリポジトリをローカルに clone (複製)してみましょう。
GitHub の denismm/dmmlib にアクセスして、Code ボタンを押すと表示されるポップアップで、 https:// ~ .git をコピーします。

複製を配置したいフォルダをエクスプローラで開いてから、アドレスバーに cmd⏎ と入力するなどしてコマンドプロンプトを開きます。
起動したコマンドプロンプトに、以下のように git clone の後に先ほどコピーした https:// ~ .git を貼り付けます。
GitHub で公開されている denismm/dmmlib のリポジトリのクローン(複製)を得る場合は、以下のコマンドを使います。
※以下のコマンドでは Git for Windows ではシンボリックリンクをシンボリックリンクとして取得できません。
git clone https://github.com/denismm/dmmlib.git
コマンドを入力すると、「Connect to GitHub」ダイアログが表示されるので「Sign in with your browser」ボタンを押してウェブブラウザでサインインを行うと、指定したリポジトリの clone (複製)が取得できます。


リポジトリのクローンを作業ディレクトリに配置できました(例では dmmlib フォルダ)。

clone で複製したローカルの lines.ps を見てみると、シンボリックリンクではなく、通常のファイルとして保存されています。
lines.ps ファイルの中身は、 lines/lines.ps と、シンボリックリンクの指す相対パスが書かれているテキストファイルでした。
以上のように、Git for Windows がシンボリックリンクに対応していない状態で、シンボリックリンクを含むリポジトリを clone (複製)すると、シンボリックリンクではなく、相対パスが書かれているテキストファイルとして複製されたので、実行時にエラーが起きる可能性があります。

対応させるには clone などのコマンドを実行する際に、core.symlinks=true をあらかじめ設定しておくことでリポジトリのシンボリックリンクを Git for Windows でも扱えます。
core.symlinks
If false, symbolic links are checked out as small plain files that contain the link text. git-update-index[1] and git-add[1] will not change the recorded type to regular file. Useful on filesystems like FAT that do not support symbolic links.
The default is true, except git-clone[1] or git-init[1] will probe and set core.symlinks false if appropriate when the repository is created.
コア.シンボリックリンク false の場合、シンボリック リンクは、リンク テキストを含む小さなプレーン ファイルとしてチェックアウトされます。 git-update-index[1] と git-add[1] は、記録されたタイプを通常のファイルに変更しません。シンボリック リンクをサポートしない FAT などのファイル システムで役立ちます。 デフォルトは true ですが、リポジトリの作成時に git-clone[1] または git-init[1] がプローブされ、必要に応じて core.symlinks false に設定されます。Git – git-config Documentation #coresymlinks と Google 翻訳
core.symlinks などの設定は、git config コマンドであらかじめ設定できますが、 clone などのコマンドを実行する際に -c オプションを使うことで、設定と同時にコマンドを実行できます。
You may also provide additional configuration parameters when running any git command by using the
-c
option. See git[1] for details.git コマンドを実行するときに、-c オプションを使用して追加の構成パラメーターを指定することもできます。詳細については git[1] を参照してください。Git – git-config Documentation
このことから、Git for Windows でシンボリックリンクを含むリポジトリを clone (複製) したい場合は、以下のように -c オプションで core.symlinks を有効 (true) にした状態で clone コマンドを実行する必要があります。
以下は、GitHub で公開されている denismm/dmmlib リポジトリを取得する際の git clone コマンドの例です。
-c core.symlinks=true によって、シンボリックリンクに対応した clone を行います。
git clone -c core.symlinks=true https://github.com/denismm/dmmlib.git
NG:管理者権限がないと失敗してしまう
しかし、git コマンドを実行するコマンドプロンプトに管理者権限がないと git clone 実行時にシンボリックリンク自体の作成に失敗してしまいます。
Windowsでシンボリックリンクを作成するには管理者権限が必要なのですが、
Git for Windowsでシンボリックリンクを扱えるようにする #Symlink – Qiitagit clone
やln -s
を実行するためにわざわざ管理者権限を付与したくないですよね。
以下は、管理者権限がない状態で実行した際の結果です。
error: unable to create symlink から始まる行がいくつもあり、シンボリックリンクの作成に失敗しています。

G:\Dev\Mistical>git clone -c core.symlinks=true https://github.com/denismm/dmmlib.git
Cloning into 'dmmlib'...
remote: Enumerating objects: 414, done.
remote: Counting objects: 100% (207/207), done.
remote: Compressing objects: 100% (123/123), done.
remote: Total 414 (delta 120), reused 165 (delta 80), pack-reused 207 (from 1)
Receiving objects: 100% (414/414), 859.71 KiB | 4.09 MiB/s, done.
Resolving deltas: 100% (216/216), done.
error: unable to create symlink Tests/base.ps: Permission denied
error: unable to create symlink Tests/dmmlib: Permission denied
error: unable to create symlink Tests/lines.ps: Permission denied
error: unable to create symlink Tests/textbase.ps: Permission denied
error: unable to create symlink dmmlib: Permission denied
error: unable to create symlink lines.ps: Permission denied
error: unable to create symlink lines/lines.ps: Permission denied
error: unable to create symlink pshacks/lines/lines.ps.txt: Permission denied
error: unable to create symlink pshacks/readpnm/readpnm.ps.txt: Permission denied
error: unable to create symlink readpnm.ps: Permission denied
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'
git clone を実行して複製されたフォルダを見ると、差分がある状態であることが TortoiseGit のシェル拡張のアイコンでわかります。
これは、前述の git clone の実行結果の説明に書いてあるように、複製はできたけれど、チェックアウトに失敗している状態です。

成功:管理者権限で起動したコマンドプロンプトでシンボリックリンク対応の git clone
シンボリックリンクを作成するために、管理者権限で git clone を実行します。
コマンドプロンプトを管理者権限で起動します。
Windows 10 の場合は、デスクトップの左下の検索ボックスに cmd と入力してから、検索された「コマンドプロンプト システム」の「管理者として実行」リンクをクリックしても、管理者権限でコマンドプロンプトを起動できます。

起動したコマンドプロンプトのタイトルに「管理者」と表示されています。
cd コマンドで複製を配置したいフォルダまで移動します。
ドライブが異なる場合は /d を付けて、ドライブ名:\ からパスを指定します。

先ほどと同じく、 -c core.symlinks = true がついた git clone コマンドを実行すると、今度は先ほどのシンボリックリンクの作成失敗のエラーは発生しませんでした。
※以下は GitHub で公開されている denismm/dmmlib リポジトリを取得する際の git clone コマンドの例です。
git clone -c core.symlinks=true https://github.com/denismm/dmmlib.git
URL は、GitHub ならば、冒頭で紹介したように Code ボタンを押すと表示されるポップアップからコピーできます。

C:\Windows\system32>cd /d g:\Dev\Mistical
g:\Dev\Mistical>git clone -c core.symlinks=true https://github.com/denismm/dmmlib.git
Cloning into 'dmmlib'...
remote: Enumerating objects: 414, done.
remote: Counting objects: 100% (207/207), done.
remote: Compressing objects: 100% (123/123), done.
remote: Total 414 (delta 120), reused 165 (delta 80), pack-reused 207 (from 1)
Receiving objects: 100% (414/414), 859.71 KiB | 6.99 MiB/s, done.
Resolving deltas: 100% (216/216), done.
複製されたフォルダのシンボリックリンクである lines.ps を見ると、ショートカットアイコンのファイルアイコンが表示され、種類には .symlink と表示され、シンボリックリンクとして機能する形で clone (複製) できました。

今回はここまで
後半では、リポジトリに異常がないことの確認や、シンボリックリンクを扱う際の注意点について紹介します。
参照サイト Thank You!
- Git
- Git – git-config Documentation #coresymlinks
- Git – git-config Documentation
- denismm/dmmlib: Library of convenient postscript functions
- Git for Windowsでシンボリックリンクを扱えるようにする #Symlink – Qiita
記事一覧 → Compota-Soft-Press
コメント