Si j'ai un fichier ou un répertoire qui est un lien symbolique et que je le valide dans un référentiel Git, que se passe-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 lorsque je supprime le fichier auquel il fait référence? Commet-il simplement le lien pendant?
.gitignore
voit le lien symbolique comme un fichier et non comme un dossier.../..
au besoin.git pull
créez un fichier au lieu d'un lien symbolique, essayez d'exécuter votre client Git en tant qu'administrateur.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 arborescent qui représente son répertoire conteneur.
Lorsque vous extrayez une arborescence contenant le lien, elle restaure l'objet en tant que lien symbolique, que l'objet du système de fichiers cible existe ou non.
Si vous supprimez le fichier référencé par le lien symbolique, cela 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.
la source
core.symlinks
variable de configuration sur false et les liens symboliques seront extraits sous forme de petits fichiers de texte brut contenant le texte du lien.symlinks = false
problèmes avec eux.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:
Git ne connaît pas encore ce fichier.
git ls-files
vous permet d'inspecter votre index ( sortie de type-s
impressionsstat
):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.
Alors, qu'est-ce qui a été ajouté?
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 lals-files
sortie. Ce serait quelque chose comme100644
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. Deman git-config
: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.
la source
Répertoires liés symboliquement:
Il est important de noter ce qui se passe lorsqu'il existe un répertoire qui est un lien logiciel. Tout pull Git avec une mise à jour supprime le lien et en fait un répertoire normal. C'est ce que j'ai appris à la dure. Quelques aperçus ici et ici.
Exemple
Avant
git add/commit/push
Après
git pull
ET quelques mises à jour trouvéesla source