Git for Windows シンボリックリンクを含むリポジトリのクローン

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

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

※Git-2.49.0 (64 bit) を使用します。

管理者権限で git clone を実行した失敗例

リモートリポジトリのクローンを置くための空のフォルダを新規作成します。

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定1

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

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定2

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

git clone リモートリポジトリのURL .

シンボリックリンクではなくファイルとして gut が作成されてしまいました

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定3
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 branch --remotes で確認できます)、クローンされたリポジトリの現在アクティブなブランチからフォークされた初期ブランチを作成、チェックアウトします。

Git – git-clone Documentation

管理者権限 + symlinks = true でクローン

今度は、 git config の core.symlinks true設定してからクローンを行います。

先ほどと同じく、リモートリポジトリのクローンを置くための空のフォルダを新規作成します。

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定4

先ほどと同じく、管理者権限コマンドプロンプトを起動して、このディレクトリに移動します。

git config コマンドでグローバルの core.symlinks の値を確認すると未設定 ( false と同義 ) でした。

git config core.symlinks true で true を設定してから、git clone を先ほどと同じように実行します。

クローンが完了したら、再びグローバルの core.symlinks の設定を –unset オプションで未設定に戻します。

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定5
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 バイトで、ダブルクリックしてもリンク先を開けません
シンボリックリンクのリンク先がサブモジュールなどではなく、すでに実体がある場合は、ここまでで正常に作られているかもしれません。

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定6

シンボリックリンクはリンク先の実体が必要

mklink でシンボリックリンクを作成するためには、リンク先の実体が必要のようです。

ディレクトリまたはファイルのシンボリック リンクまたはハード リンクを作成します。

mklink | Microsoft Learn

git clone の段階では、シンボリックリンクのリンク先の実体が、サブモジュールだったためまだ作成されていませんでした

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定7

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

シンボリックリンクのリンク先のフォルダサブモジュール内に作成されました。

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定8

シンボリックリンクを削除してからチェックアウト

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

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定12

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

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定9
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. 

作業ツリー内のファイルを更新して、インデックスまたは指定されたツリー内のバージョンと一致させます。

-f
--force

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 バイトではないシンボリックリンクが作成されました。

Git for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定10
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 for Windows シンボリックリンクを含むリモートリポジトリのクローンに必要な設定11

まとめ

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

参照サイト 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をコピーしました