web-dev-qa-db-fra.com

Liens Git et durs

Étant donné que Git ne reconnaît pas les liens symboliques qui pointent en dehors du référentiel, y a-t-il un problème avec les liens durs?

Git pourrait-il les casser? Pouvez-vous me signaler des informations détaillées?

78
Alfredo Palhares

L'objet 'tree', représentant des répertoires dans Git, stocke le nom de fichier et les (sous-ensembles de) autorisations. Il ne stocke pas le numéro d'inode (ou un autre type d'ID de fichier). Par conséquent liens durs ne peut pas être représenté dans git, du moins pas sans outils tiers tels que metastore ou git-cache-meta (et je ne sais pas si c'est possible même avec ces outils).

Git essaie de ne pas toucher aux fichiers qu'il n'a pas besoin de mettre à jour, mais vous devez tenir compte du fait que git n'essaie pas de conserver les liens physiques, ils peuvent donc être cassés par git.


A propos des liens symboliques pointant hors du référentiel : git n'a aucun problème avec eux et devrait conserver le contenu des liens symboliques ... mais l'utilité de ces liens me semble douteuse , comme si ces liens symboliques seraient brisés ou non dépend de la disposition du système de fichiers extérieur dépôt git, et non sous contrôle de git.

69
Jakub Narębski

Ok, maintenant c'est une réponse tardive = D

J'ai découvert qu'en utilisant des crochets, vous pouvez capturer le git pull événement (quand il y a quelque chose à tirer ...) écrit le gestionnaire d'événements de script dans .git/hooks/post-merge fichier.

Vous devez d'abord chmod +x il.

Ensuite, placez-y les commandes ln pour recréer des liens durs à chaque pull. Neat hein!

Ça marche, j'avais juste besoin de ça pour mon projet et ls -i montre que les fichiers ont été automatiquement liés après pull.


Mon exemple de .git/hooks/post-merge:

#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf

IMPORTANT: comme vous pouvez le voir, le chemin d'accès à n'importe quel fichier de votre référentiel doit commencer par $GIT_DIR, puis ajoutez le chemin relatif partiel au fichier.

Aussi important: -f est nécessaire, car vous recréez le fichier de destination.

16
Niloct

De cela problème msysgit

Les points de jonction ne sont pas des liens symboliques; par conséquent, les liens symboliques ne sont tout simplement pas pris en charge dans msysGit.

De plus, les liens durs n'ont jamais été suivis par Git .

Le problème était orienté Windows (car il s'agit de msysgit) et d'un débat sur le support potentiel de symlink.
Mais le commentaire sur le lien dur concerne Git en général.

7
VonC

Google 'git conserve les liens durs' et cela montre que git ne sait pas comment conserver la structure des liens durs AFAIK, peut-être par conception.

Mes projets Web utilisent des liens durs comme suit:

www/products/index.php
www/products/Dell_latitude_id577/index.php #(hard linked to above)
www/products/Dell_inspiron_id323/index.php #(hard linked again to above)

me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*

Si je voulais apporter des modifications à index.php, je le change en un seul endroit et les liens physiques (pages de détails du produit) pointent vers les changements - sauf que git ne conserve pas cette relation pendant le clonage et l'extraction sur d'autres ordinateurs.

me@server:www$ git pull

sur une autre machine va créer un nouveau index.php pour chaque lien dur.

1
xce_git