É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 physiques?
Git pourrait-il les casser? Pouvez-vous s'il vous plaît me diriger vers des informations détaillées?
É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 physiques?
Git pourrait-il les casser? Pouvez-vous s'il vous plaît me diriger vers des informations détaillées?
Réponses:
L'objet 'tree', représentant les répertoires dans Git, stocke le nom de fichier et le (sous-ensemble de) permissions. Il ne stocke pas le numéro d'inode (ou tout autre type d'identifiant de fichier). Par conséquent, les liens durs ne peuvent pas être représentés dans git , du moins pas sans outils tiers tels que metastore ou git-cache-meta (et je ne suis pas sûr que cela soit possible même avec ces outils).
Git essaie de ne pas toucher les fichiers qu'il n'a pas besoin de mettre à jour, mais vous devez tenir compte du fait que git n'essaye pas de préserver les liens physiques, afin qu'ils puissent être interrompus par git.
À propos des liens symboliques pointant en dehors du référentiel : git n'a aucun problème avec eux et devrait préserver le contenu des liens symboliques ... mais l'utilité de ces liens est douteuse pour moi, car le fait que ces liens symboliques soient rompus ou non dépend de la disposition du système de fichiers en dehors du référentiel git , et non sous le contrôle de git.
J'ai découvert qu'en utilisant des hooks, vous pouvez capturer l' git pull
événement (quand il y a quelque chose à extraire ...) en écrivant le gestionnaire d'événements de script dans un .git/hooks/post-merge
fichier.
Tout d'abord, vous devez le faire chmod +x
.
Ensuite, mettez les ln
commandes à l'intérieur pour recréer des liens physiques à chaque pull. Neat hein!
Cela fonctionne, j'en avais juste besoin pour mon projet et ls -i
montre que les fichiers étaient 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 ajouter le chemin relatif partiel au fichier.
Également important: -f
est nécessaire, car vous recréez le fichier de destination.
À partir de ce 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 physiques n'ont jamais été suivis par Git .
Le problème était orienté Windows (puisqu'il s'agit de msysgit) et le débat sur le support potentiel de symlink.
Mais le commentaire sur le lien dur concerne Git en général.
Google 'git préserve les liens durs' et cela montre que git ne sait pas comment préserver la structure des liens durs AFAIK, peut-être par conception.
Mes projets Web utilisent des liens physiques 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 créera un nouveau index.php pour chaque lien physique.
hardlink --ignore-time
sur /var/lib/jenkins
, pour récupérer l' espace disque. Au cours de la journée, certains fichiers sont à nouveau dissociés après git pull
ou, mvn compile
mais c'est correct, je m'attends à ce que cela se produise. Si git devait conserver les liens durs, ma stratégie de recyclage de l'espace disque ne fonctionnerait pas.