無料のバージョン管理ソフト Git を用いて、シンボリックリンクを含むリモートリポジトリをクローンする際の config の設定、管理者権限の必要性について紹介します。
また、シンボリックリンクのリンク先がサブモジュールだった場合、クローン時のチェックアウトでは シンボリックリンクが 0 バイトで作成されてしまう現象と対処例についても紹介します。

※Git-2.49.0 (64 bit) を使用します。
管理者権限で git clone を実行した失敗例
リモートリポジトリのクローンを置くための空のフォルダを新規作成します。

シンボリックリンクの作成には Windows 10 では管理者権限が必要なので、コマンドプロンプトを管理者権限で起動します。
※コミットやプッシュの際は、実際にシンボリックリンクを作るわけではなく、オブジェクトのモードやファイルの内容を保存するためか管理者権限は必要ありませんでした。

クローンを置く空のフォルダに cd コマンドで移動して以下のように git clone コマンドを実行します。
※ドライブを変える場合は cd コマンドの /d オプションを使います。
※最後の . はカレントディレクトリに置くことを指します。
git clone リモートリポジトリのURL .
シンボリックリンクではなくファイルとして gut が作成されてしまいました。

C:\Windows\system32>cd /d G:\Dev\Godot4GD\SakuraCrowd\tmp\2
G:\Dev\Godot4GD\SakuraCrowd\tmp\2>git clone G:\Dev\remotes\godot\SakuraCrowdGodotLib .
Cloning into '.'...
done.
G:\Dev\Godot4GD\SakuraCrowd\tmp\2>cd addons
G:\Dev\Godot4GD\SakuraCrowd\tmp\2\addons>dir
ドライブ G のボリューム ラベルは ボリューム です
ボリューム シリアル番号は 9691-AE5E です
G:\Dev\Godot4GD\SakuraCrowd\tmp\2\addons のディレクトリ
2025/08/07 11:45 <DIR> .
2025/08/07 11:45 <DIR> ..
2025/08/07 11:45 29 gut
1 個のファイル 29 バイト
2 個のディレクトリ 2,423,411,752,960 バイトの空き領域
リポジトリを新たに作成されたディレクトリにクローンし、クローンされたリポジトリの各ブランチにリモートトラッキングブランチを作成し(
Git – git-clone Documentationgit branch --remotes
で確認できます)、クローンされたリポジトリの現在アクティブなブランチからフォークされた初期ブランチを作成、チェックアウトします。
管理者権限 + symlinks = true でクローン
今度は、 git config の core.symlinks を true に設定してから、クローンを行います。
先ほどと同じく、リモートリポジトリのクローンを置くための空のフォルダを新規作成します。

先ほどと同じく、管理者権限でコマンドプロンプトを起動して、このディレクトリに移動します。
git config コマンドでグローバルの core.symlinks の値を確認すると未設定 ( false と同義 ) でした。
git config core.symlinks true で true を設定してから、git clone を先ほどと同じように実行します。
クローンが完了したら、再びグローバルの core.symlinks の設定を –unset オプションで未設定に戻します。

C:\Windows\system32>cd /d G:\Dev\Godot4GD\SakuraCrowd\tmp\3
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git config --global core.symlinks
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git config --global core.symlinks true
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git config --global core.symlinks
true
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git clone G:\Dev\remotes\godot\SakuraCrowdGodotLib .
Cloning into '.'...
done.
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git config --global --unset core.symlinks
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git config --global core.symlinks
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>
You can query/set/replace/unset options with this command. The name is actually the section and the key separated by a dot, and the value will be escaped.
このコマンドを使用して、オプションを照会/設定/置換/設定解除できます。名前は実際にはドットで区切られたセクションとキーであり、値はエスケープされます。
–unset <name> [<value-pattern>]
Replaced by
git
config
unset
[--value=
<pattern>] <name>.git config unset [–value=] に置き換えられます。
Git – git-config Documentation と Google 翻訳
管理者権限と symlinks = true によって、git clone でシンボリックリンクが作成できました。
しかし、 0 バイトで、ダブルクリックしてもリンク先を開けません。
※シンボリックリンクのリンク先がサブモジュールなどではなく、すでに実体がある場合は、ここまでで正常に作られているかもしれません。

シンボリックリンクはリンク先の実体が必要
mklink でシンボリックリンクを作成するためには、リンク先の実体が必要のようです。
ディレクトリまたはファイルのシンボリック リンクまたはハード リンクを作成します。
mklink | Microsoft Learn
git clone の段階では、シンボリックリンクのリンク先の実体が、サブモジュールだったためまだ作成されていませんでした。

git submodule init, git submodule update コマンドで、クローンしたリポジトリに設定されているサブモジュールの内部の構成も取得します。
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git submodule init
Submodule 'third_party/Gut' (https://github.com/sakura-crowd/Gut.git) registered for path 'third_party/Gut'
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git submodule update
Cloning into 'G:/Dev/Godot4GD/SakuraCrowd/tmp/3/third_party/Gut'...
Submodule path 'third_party/Gut': checked out '5043bfe1f3bc6e32ba3dd181ee8b99fe088c70a4'
Inspects, updates and manages submodules.
サブモジュールを検査、更新、管理します。
init [–] [<path>…]
Initialize the submodules recorded in the index (which were added and committed elsewhere) by setting
submodule.$name.url
in.git/config
, using the same setting from.gitmodules
as a template..gitmodules の同じ設定をテンプレートとして使用し、.git/config に submodule.$name.url を設定して、インデックスに記録されたサブモジュール(別の場所に追加およびコミットされたもの)を初期化します。
Update the registered submodules to match what the superproject expects by cloning missing submodules, fetching missing commits in submodules and updating the working tree of the submodules.
欠落しているサブモジュールのクローンを作成し、サブモジュール内の欠落しているコミットをフェッチし、サブモジュールの作業ツリーを更新することにより、スーパープロジェクトが期待するものと一致するように登録されたサブモジュールを更新します。
Git – git-submodule Documentation
シンボリックリンクのリンク先のフォルダがサブモジュール内に作成されました。

シンボリックリンクを削除してからチェックアウト
クローンの段階では、シンボリックリンクのリンク先の実体が、サブモジュールだったせいで作られていなかったため、 gut シンボリックリンクは 0 バイトで作成されました。

この項目を一度削除してから、git checkout で再び取得すると、リンク先の情報が含まれた有効なシンボリックリンクが作成されました。
※同名のシンボリックリンクがあると git checkout –force でも上書きできなかったので、いったん削除してからチェックアウトしました。

G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git branch
* main
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git config core.symlinks
true
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git checkout --force main -- addons/gut
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>del addons\gut
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>git checkout --force main -- addons/gut
G:\Dev\Godot4GD\SakuraCrowd\tmp\3>
Updates files in the working tree to match the version in the index or the specified tree.
作業ツリー内のファイルを更新して、インデックスまたは指定されたツリー内のバージョンと一致させます。
When switching branches, proceed even if the index or the working tree differs from
HEAD
, and even if there are untracked files in the way. This is used to throw away local changes and any untracked files or directories that are in the way.When checking out paths from the index, do not fail upon unmerged entries; instead, unmerged entries are ignored.
ブランチを切り替えるときは、インデックスまたは作業ツリーが HEAD と異なる場合や、途中に追跡されていないファイルがある場合でも続行します。これは、ローカルの変更と、邪魔になっている追跡されていないファイルやディレクトリを破棄するために使用されます。
インデックスからパスをチェックアウトするときは、マージされていないエントリを必ずチェックしてください。代わりに、マージされていないエントリは無視されます。
Git – git-checkout Documentation と Google 翻訳
リンク先の実体を作ってからチェックアウトすると、サイズが 0 バイトではないシンボリックリンクが作成されました。

G:\Dev\Godot4GD\SakuraCrowd\tmp\3>cd addons
G:\Dev\Godot4GD\SakuraCrowd\tmp\3\addons>dir
ドライブ G のボリューム ラベルは ボリューム です
ボリューム シリアル番号は 9691-AE5E です
G:\Dev\Godot4GD\SakuraCrowd\tmp\3\addons のディレクトリ
2025/08/07 17:57 <DIR> .
2025/08/07 17:57 <DIR> ..
2025/08/07 17:57 <SYMLINKD> gut [..\third_party\Gut\addons\gut]
0 個のファイル 0 バイト
3 個のディレクトリ 2,414,847,074,304 バイトの空き領域
チェックアウトで作成されたシンボリックリンクをダブルクリックするとリンク先が開かれました。

まとめ
今回は、無料のバージョン管理ソフト Git を用いて、シンボリックリンクを含むリモートリポジトリをクローンする際の config の設定、管理者権限の必要性について紹介しました。
また、シンボリックリンクのリンク先がサブモジュールだった場合、クローン時のチェックアウトでは シンボリックリンクが 0 バイトで作成されてしまう現象と対処例についても紹介しました。
参照サイト Thank You!
記事一覧 → Compota-Soft-Press
コメント