Question Comment git gère-t-il les liens symboliques?


Si j'ai un fichier ou un répertoire qui est un lien symbolique et que je le commets à un repo git, qu'arrive-t-il?

Je suppose qu'il le laisse comme un lien symbolique jusqu'à ce que le fichier soit supprimé, puis si vous retirez le fichier d'une ancienne version, il crée simplement un fichier normal.

Que fait-il quand je supprime le fichier auquel il fait référence? Est-ce que ça suffit de commettre le lien qui pend


1314
2018-06-05 06:53


origine


Réponses:


git stocke simplement le contenu du lien (c'est-à-dire le chemin de l'objet du système de fichiers auquel il est lié) dans un 'blob' comme il le ferait pour un fichier normal. Il stocke ensuite le nom, le mode et le type (y compris le fait qu'il s'agit d'un lien symbolique) dans l'objet arborescence qui représente son répertoire conteneur.

Lorsque vous extrayez un arbre contenant le lien, il restaure l'objet en tant que lien symbolique, que l'objet système de fichiers cible existe ou non.

Si vous supprimez le fichier référencé par le lien symbolique, il n'a aucun effet sur le lien symbolique git. Vous aurez une référence qui pendouille. Il appartient à l'utilisateur de supprimer ou de modifier le lien pour pointer vers quelque chose de valide si nécessaire.


1096
2018-06-05 07:01



TL; DR: Les données référencées par le lien symbolique ne sont pas stockées dans le référentiel.


Vous pouvez découvrir ce que fait Git 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 engagé, vous pouvez utiliser git checkout ramener tout ce qui était dans l'index dans le répertoire de travail. Alors, que fait Git quand vous ajoutez un lien symbolique à l'index?

Pour le savoir, faites d'abord 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 (-s imprime stat-comme sortie):

$ git ls-files -s ./symlink
$

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 condensé créé dans le magasin d'objets Git. Vous pouvez examiner cet objet si vous regardez dans .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c.

le 120000 est le mode fichier. Ce serait quelque chose comme 100644 pour un fichier régulier et est le mode spécial pour les liens. De man git-config:

core.symlinks

Si la valeur est false, les liens symboliques sont extraits en tant que petits fichiers simples contenant le texte du lien. git-update-index (1) et git-add (1) ne changeront pas le type enregistré en fichier normal.

Utilisation git cat-file -p pour bien imprimer le contenu:

$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink

Donc, c'est ce que fait Git à un lien symbolique: quand vous git checkout le lien symbolique, vous obtenez soit un fichier texte avec une référence à un chemin complet du système de fichiers, soit un lien symbolique, selon la configuration. Les données référencées par le lien symbolique ne sont pas stockées dans le référentiel.


151
2017-09-13 17:06



Répertoires symétriques:

Il est important de noter ce qui se passe quand il y a un répertoire qui est un lien logiciel. Tout git pull avec une mise à jour supprime le lien et en fait un répertoire normal. C'est ce que j'ai appris durement. Quelques idées ici et ici.

Exemple

Avant

 ls -l
 lrwxrwxrwx 1 admin adm   29 Sep 30 15:28 src/somedir -> /mnt/somedir

git ajouter / commenter / pousser

It remains the same

Après git pull ET quelques mises à jour trouvées

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir

139
2017-10-02 06:16