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 checkout
pour 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-files
vous permet d'inspecter votre index ( sortie de type -s
impressions 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/96f9db1b9610f238b78dd168ae33faa2dec15c
dans 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 120000
le mode est répertorié dans la ls-files
sortie. Ce serait quelque chose comme 100644
pour 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.symlinks
configuration. 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.symlinks
configuration.
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.
.gitignore
voit le lien symbolique comme un fichier et non comme un dossier.