Git シンボリックリンクを含むリポジトリの取得(clone)を行う手順1/2

無料ソースコード管理 (SCM: software configuration management) ソフト Git for Windows を用いて、GitHub で公開されているシンボリックリンクを含むリポジトリを、 git clone コマンドを使ってローカルに複製する手順を紹介します。
Windows 版の Git でシンボリックリンクに対応するための設定や、複製したシンボリックリンクの注意点についても紹介します。

見出しの最初に NG と書かれている章は、失敗例であり、シンボリックリンクを含むリポジトリから複製できなかった際の原因を紹介しています
シンボリックリンクを含むリポジトリを複製する手順については、最後の成功例の章だけを読んでも構いません。

git-scm 公式サイトの一部 20250408

※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 だけが記述されていて、その相対パスを指しているだけで、実体はありません。

GitForWindows シンボリックリンクのあるリポジトリの取得20

試しに、 GitHub で公開されている denismm/dmmlib のリポジトリをローカルに clone (複製)してみましょう。

GitHub の denismm/dmmlib にアクセスして、Code ボタンを押すと表示されるポップアップで、 https:// ~ .git をコピーします。

GitForWindows シンボリックリンクのあるリポジトリの取得21

複製を配置したいフォルダをエクスプローラで開いてから、アドレスバーに 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 (複製)が取得できます。

GitForWindows シンボリックリンクのあるリポジトリの取得1
GitForWindows シンボリックリンクのあるリポジトリの取得2

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

GitForWindows シンボリックリンクのあるリポジトリの取得3

clone で複製したローカルの lines.ps を見てみると、シンボリックリンクではなく、通常のファイルとして保存されています。

lines.ps ファイルの中身は、 lines/lines.ps と、シンボリックリンクの指す相対パスが書かれているテキストファイルでした。

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

GitForWindows シンボリックリンクのあるリポジトリの取得4

対応させるには 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 cloneln -sを実行するためにわざわざ管理者権限を付与したくないですよね。

Git for Windowsでシンボリックリンクを扱えるようにする #Symlink – Qiita

以下は、管理者権限がない状態で実行した際の結果です。

error: unable to create symlink から始まる行がいくつもあり、シンボリックリンクの作成に失敗しています。

GitForWindows シンボリックリンクのあるリポジトリの取得6
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 の実行結果の説明に書いてあるように、複製はできたけれど、チェックアウトに失敗している状態です。

GitForWindows シンボリックリンクのあるリポジトリの取得8

成功:管理者権限で起動したコマンドプロンプトでシンボリックリンク対応の git clone

シンボリックリンクを作成するために、管理者権限で git clone を実行します。
コマンドプロンプトを管理者権限で起動します。

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

GitForWindows シンボリックリンクのあるリポジトリの取得9

起動したコマンドプロンプトのタイトルに「管理者」と表示されています。

cd コマンドで複製を配置したいフォルダまで移動します。
ドライブが異なる場合は /d を付けて、ドライブ名:\ からパスを指定します。

GitForWindows シンボリックリンクのあるリポジトリの取得10

先ほどと同じく、 -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 ボタンを押すと表示されるポップアップからコピーできます。

GitForWindows シンボリックリンクのあるリポジトリの取得21
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 (複製) できました

GitForWindows シンボリックリンクのあるリポジトリの取得11

今回はここまで

後半では、リポジトリに異常がないことの確認や、シンボリックリンクを扱う際の注意点について紹介します。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました