1715 votes

Ce n'git faire pour les fichiers qui sont un lien symbolique?

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 suppose qu'il laisse comme un lien symbolique jusqu'à ce que le fichier est supprimé et puis si vous tirez de nouveau le fichier à partir d'une ancienne version, il crée simplement un fichier normal.

Que faut-il faire quand je supprime le fichier il des références? Est-il juste de commettre le balançant lien?

1421voto

Charles Bailey Points 244082

git juste stocke le contenu du lien (c'est à dire le chemin de l'objet système de fichiers qu'elle lie) dans un "blob" juste comme il le ferait pour un fichier normal. Il stocke ensuite le nom, le mode et le type (y compris le fait qu'il est un lien symbolique) dans l'arborescence de l'objet qui représente son répertoire contenant.

Lorsque vous commandez un arbre contenant le lien, il restaure l'objet comme un lien symbolique, peu importe si le système de fichiers cible de l'objet existe ou pas.

Si vous supprimez le fichier que le lien symbolique références il n'a pas d'incidence sur le git-contrôlé lien symbolique en quelque sorte. Vous aurez une balançant de référence. C'est à l'utilisateur de supprimer ou de modifier le lien pour pointer vers quelque chose de valable en cas de besoin.

293voto

dimadima Points 2803

Ce n'git faire pour les fichiers qui sont un lien symbolique?

Voulant savoir ce qu'est Git ne dans un fichier, dans ce cas, un lien symbolique peut être résolu par trouver ce que Git n'lorsque vous ajoutez le fichier à l'index.

Pourquoi l'index? Car l'index est la validation qui sera créée lors du prochain commit. Avec l'index engagé, vous pouvez utiliser git checkout d'apporter tout ce qui était dans l'index et formait le dernier s'engager de nouveau dans le répertoire de travail. Donc ce qui compte c'est l'index, parce que c'est ce que Git stocke et gère, et comment Git remet les choses dans l'index peut vaguement être considéré comme ce que Git n'.

Donc, qu'est-Git faire lorsque vous ajoutez un lien symbolique à l'index? Nous allons l'essayer. Tout d'abord, faire un lien symbolique:

$ ln -s /Path/referenced/by/symlink symlink

C'est un lien symbolique! Voir l' "lrwxr-xr-x":

$ stat symlink  
16777219 95962532 lrwxr-xr-x 1 dmitry staff 0 20 "Sep 13 12:42:57 2013" "Sep 13 12:42:57 2013" "Sep 13 12:42:57 2013" "Sep 13 12:42:57 2013" 4096 8 0 symlink

Git ne le sait pas encore de fichier. git ls-files vous permet d'inspecter votre indice (-s tirages stat-comme en sortie):

$ git ls-files -s ./symblink
[Nothing!]

Maintenant, ajoutez le contenu du lien symbolique vers le Git magasin d'objets 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

Donc, 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 en .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c.

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

de base.les liens symboliques

Si la valeur est false, les liens symboliques sont extraits petite plaine les fichiers qui contiennent le texte du lien. git-mise à jour de l'index(1) et git-add(1) pas de changement de l'enregistrement type de fichier régulier.

Utiliser git cat-file -p à joli-imprimer le contenu:

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

Donc, c'est ce que Git ne à 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 de chemin d'accès, ou d'un lien symbolique, en fonction de la configuration. Les données référencées par le lien symbolique n'est pas stocké dans le repository.

150voto

Shekhar Points 3632

Un lien symbolique répertoires:

Il est important de noter ce qui se passe quand il y a un répertoire qui est un doux lien. Tout 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 idées 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

Après la commande git pull ET certaines mises à jour trouvées

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

24voto

John Whitley Points 1196

De plus sur un lien symbolique répertoires:

Il est intéressant de noter que Pythonic des mises en garde sur un lien symbolique répertoires ne pas s'appliquer à versionnées des liens symboliques. Les principaux cas de bord en question est celle de gens de faire un lien symbolique de certains ou de la totalité de l'arbre de travail dans un chemin différent (disons sur une partition différente avec plus d'espace disque) et d'attendre git pour vérifier le code via le lien symbolique.

C'est, si vous avez un projet qui contient versionnées des liens symboliques vers des fichiers ou des répertoires, le lien symbolique-que-blob comportement de préserver les liens symboliques, correctement les changements de version de ces liens symboliques, et de travailler comme prévu.

Le comportement testé avec git 1.6.5.6; mais je soupçonne fortement que versionnées comportement a été corrigé dans git pour assez un certain temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X