Comment git gérer les liens symboliques?

Si j'ai un fichier ou un répertoire est un lien symbolique, et je m'engage à un repo git ce qui se passe?

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

Que fait-il lorsque je supprime le fichier auquel il renvoie? Est-ce que ça crée juste le lien?

1338
demandé sur mikemaccana 2009-06-05 10:53:33

3 réponses

git stocke simplement le contenu du lien (c'est-à-dire le chemin de l'objet du système de fichiers auquel il renvoie) 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 tree qui représente son répertoire contenant.

lorsque vous vérifiez un arbre contenant le lien, il restaure l'objet comme un lien symbolique indépendamment du fait que l'objet du système de fichiers cible existe ou non.

si vous supprimez le fichier auquel le lien symbolique fait référence, il n'affecte en rien le lien symbolique contrôlé par git. Vous aurez une référence pendante. Il appartient à l'utilisateur de supprimer ou de modifier le lien pour pointer vers quelque chose de valide si nécessaire.

1124
répondu CB Bailey 2009-06-05 07:01:18

TL;DR: les données référencées par le lien symbolique ne sont pas stockées dans le dépôt.


vous pouvez savoir ce que Git fait avec un fichier en voyant ce qu'il fait lorsque vous l'ajoutez à l'index. L'index est comme un pre-commit. Avec l'index engagé, vous pouvez utiliser git checkout pour apporter 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 savoir, d'abord, faire 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 la 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 Git magasin d'objets.

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

le 120000 est le mode fichier. Il serait quelque chose comme 100644 pour un fichier normal et le mode spécial pour les liens. À partir de man git-config :

de base.symbolique

si faux, les liens symboliques sont vérifiés comme de petits fichiers simples qui contiennent le texte du lien. git-update-index(1) et git-add (1) ne changeront pas le type enregistré en fichier régulier.

utilisez git cat-file -p pour imprimer le contenu:

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

donc, c'est ce que Git fait à un lien symbolique: lorsque vous git checkout le lien symbolique, vous obtenez soit un fichier texte avec une référence à un système de fichiers complet chemin, ou un lien symbolique, selon la configuration. les données référencées par le lien symbolique ne sont pas stockées dans le dépôt.

160
répondu Dmitry Minkovsky 2017-09-20 15:44:28

annuaires Symlinked:

il est important de noter ce qui se passe quand il y a un répertoire qui est un lien doux. Toute git pull avec une mise à jour supprime le lien et en fait un répertoire normal. C'est ce que j'ai appris la manière dure. Quelques pistes de réflexion ici et ici.

exemple

avant

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

git add / commit/push

It remains the same

D'après git pull et quelques mises à jour trouvées

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir
141
répondu Shekhar 2012-07-27 15:52:52