インデックスにファイルを追加したときにGitが何をするかを確認することで、Gitがファイルをどのように処理するかを確認できます。インデックスはプリコミットのようなものです。インデックスがコミットされると、を使用git checkout
して、インデックス内にあったすべてのものを作業ディレクトリに戻すことができます。では、シンボリックリンクをインデックスに追加すると、Gitは何をしますか?
調べるには、まずシンボリックリンクを作成します。
$ ln -s /path/referenced/by/symlink symlink
Gitはこのファイルをまだ認識していません。git ls-files
インデックスを検査できます(-s
出力のstat
ような出力):
$ git ls-files -s ./symlink
[nothing]
次に、シンボリックリンクのコンテンツをインデックスに追加して、Gitオブジェクトストアに追加します。ファイルをインデックスに追加すると、Gitはその内容をGitオブジェクトストアに保存します。
$ git add ./symlink
それで、何が追加されましたか?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
ハッシュは、Gitオブジェクトストアで作成されたパックされたオブジェクトへの参照です。.git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
リポジトリのルートを調べれば、このオブジェクトを調べることができます。これはGitがリポジトリに保存するファイルで、後でチェックアウトできます。このファイルを調べると、非常に小さいことがわかります。リンクされたファイルの内容は保存されません。
(出力に120000
リストされているモードです。通常のファイルのls-files
よう100644
になります。)
しかし、リポジトリからファイルシステムにチェックアウトすると、Gitはこのオブジェクトをどのように処理しますか?core.symlinks
設定によって異なります。からman git-config
:
core.symlinks
falseの場合、シンボリックリンクは、リンクテキストを含む小さなプレーンファイルとしてチェックアウトされます。
そのため、リポジトリにシンボリックリンクがある場合、チェックアウト時に、構成の値に応じて、完全なファイルシステムパスへの参照を含むテキストファイル、または適切なシンボリックリンクを取得しますcore.symlinks
。
どちらの方法でも、symlinkによって参照されるデータはリポジトリに保存されません。
.gitignore
シンボリックリンクをフォルダーではなくファイルとして認識します。