Vous pouvez découvrir ce que Git fait avec un fichier en voyant ce qu'il fait lorsque vous l'ajoutez à l'index. L'index est comme un pré-commit. Avec l'index validé, vous pouvez utiliser git checkoutpour ramener tout ce qui était dans l'index dans le répertoire de travail. Alors, que fait Git lorsque vous ajoutez un lien symbolique à l'index?
Pour découvrir, tout d'abord, faites un lien symbolique:
$ ln -s /path/referenced/by/symlink symlink
Git ne connaît pas encore ce fichier. git ls-filesvous permet d'inspecter votre index ( sortie de type -simpressions stat):
$ git ls-files -s ./symlink
[nothing]
Maintenant, ajoutez le contenu du lien symbolique au magasin d'objets Git en l'ajoutant à l'index. Lorsque vous ajoutez un fichier à l'index, Git stocke son contenu dans le magasin d'objets Git.
$ git add ./symlink
Alors, qu'est-ce qui a été ajouté?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
Le hachage est une référence à l'objet compressé qui a été créé dans le magasin d'objets Git. Vous pouvez examiner cet objet si vous regardez .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15cdans la racine de votre référentiel. Il s'agit du fichier que Git stocke dans le référentiel, que vous pourrez consulter ultérieurement. Si vous examinez ce fichier, vous verrez qu'il est très petit. Il ne stocke pas le contenu du fichier lié.
(Notez que 120000le mode est répertorié dans la ls-filessortie. Ce serait quelque chose comme 100644pour un fichier normal.)
Mais que fait Git avec cet objet lorsque vous le retirez du référentiel et dans votre système de fichiers? Cela dépend de la core.symlinksconfiguration. De man git-config:
core.symlinks
Si faux, les liens symboliques sont extraits sous forme de petits fichiers simples contenant le texte du lien.
Ainsi, avec un lien symbolique dans le référentiel, lors de la vérification, vous obtenez soit un fichier texte avec une référence à un chemin complet du système de fichiers, soit un lien symbolique approprié, selon la valeur de la core.symlinksconfiguration.
Dans les deux cas, les données référencées par le lien symbolique ne sont pas stockées dans le référentiel.
.gitignorevoit le lien symbolique comme un fichier et non comme un dossier.