web-dev-qa-db-fra.com

Que se passe-t-il lorsque je clone un référentiel avec des liens symboliques sous Windows?

Il y a eu beaucoup de questions sur l'ajout de la prise en charge des liens symboliques sous Windows. Mais que se passe-t-il réellement lorsque je clone n référentiel avec des liens symboliques sous Windows?

50
Andres Riofrio

Depuis version 1.5. du client Git natif git clone et git init testera le système de fichiers cible pour la prise en charge du lien symbolique et définira la configuration du référentiel local pour core.symlinks en conséquence, c'est-à-dire à false pour FAT ou NTFS. Cela rend les liens symboliques créés et validés, par exemple sous Linux apparaissent sous forme de fichiers texte contenant le texte du lien sous Windows (voir la documentation git config sur core.symlinks pour plus de détails).

Depuis Git pour Windows version 2.10.2 le programme d'installation a ne option explicite pour activer la prise en charge des liens symboliques .

Dans les anciennes versions de Git pour Windows, vous pouvez définir manuellement core.symlinks à true qui a permis à Git de créer des liens symboliques sous les contraintes suivantes:

  • Les liens symboliques ne sont disponibles que sur Windows Vista et versions ultérieures.
  • Les liens symboliques ne fonctionneront que sur NTFS, pas sur FAT.
  • Vous devez être administrateur et/ou disposer du privilège SeCreateSymbolicLinkPrivilege.
  • Les liens symboliques sur les systèmes de fichiers distants sont désactivés par défaut.
  • Les liens symboliques de Windows sont saisis.
  • De nombreux programmes ne comprennent pas les liens symboliques (qui incluent une ancienne version de l'Explorateur Windows).

Plus détails sont disponibles sur le wiki Git pour Windows.

Dans les anciennes versions de Git pour Windows, définissez manuellement core.symlinks manuellement à true après le clonage et la réinitialisation de votre arborescence de travail, vous obtiendrez des messages d'erreur similaires à

$ git reset --hard HEAD
error: unable to create symlink directory (Function not implemented)
error: unable to create symlink linux-links/this_is_a_symbolic_link_to_file (Function not implemented)
fatal: Could not reset index file to revision 'HEAD'.

En remarque, le client JGit n'a pas sondé le système de fichiers cible pour la prise en charge du lien symbolique avant sa version 3.3, donc le core.symlinks le paramètre revenait à la configuration système/globale de Git. À partir de version 3. Sondes JGit pour la prise en charge des liens symboliques, mais semble trop conservatrice, définissant core.symlinks = falsedans certains cas où les liens symboliques seraient en fait pris en charge .

Vous pouvez commander https://github.com/sschuberth/git-playground qui contient un tas de liens créés sur Linux pour les tests.

48
sschuberth

Une solution aurait un filtre afin de détecter les liens symboliques stockés par Git et de les remplacer par le lien symbolique Windows.
Cela est détaillé dans " Git Symlinks dans Windows "

Cependant, la véritable prise en charge du lien symbolique n'est pas uniquement pour l'instant:
Voir numéro 224 et le très récent (juillet 2012) discussion sur GitHub (que vous avez consulté):

voici trois types de liens de système de fichiers sous Windows: les liens physiques, les jonctions et les liens symboliques.

  • Les liens physiques et les jonctions sont disponibles depuis NT. Les liens physiques ne peuvent pointer que vers des fichiers, les jonctions uniquement vers des répertoires (sur le même volume).
  • Les liens symboliques disponibles depuis Vista peuvent pointer vers des fichiers ou des répertoires, également sur différents volumes.
  • mklink, livré depuis Vista, peut créer tout ce qui précède. Mais la façon dont il est appelé dans le script ne fait que créer des liens symboliques (ce qui est bien, à mon humble avis, car ils ressemblent le plus à des liens symboliques Linux).

Pour la version antérieure à Vista, nous aurions besoin d'une solution de secours qui crée des liens physiques pour les fichiers à l'aide de "fsutil hardlink "(mais probablement seulement si" ln "est appelé sans" -s ") et crée des jonctions pour les répertoires à l'aide de" fsutils reparsepoint ", ou appelle simplement l'original ln.exe.

En plus de casser les configurations Windows XP, une modification comme celle-ci cassera également les configurations standard de Windows 7, car mklink nécessite des privilèges d'administrateur par défaut . Cela peut être corrigé en vérifiant si cela a fonctionné ou non, et en revenant à la copie dans de tels cas.

Juste pour mémoire: j'ai joué un peu en essayant de faire la prise en charge des liens symboliques dans Git pour Windows lui-même récemment, mais j'ai fini par conclure que la "prise en charge des liens symboliques" dans Windows 7 et plus est presque inutile pour émuler les liens symboliques Unix.

Un projet prétend " Open Source, 100% compatible ln pour Windows (et bibliothèque Junction Point) ", mais:

Malheureusement, les utilisateurs normaux ne disposent pas des autorisations requises pour créer des liens symboliques par défaut sous Windows. Combinez cela avec le fait que vous ne pouvez pas changer ce vers quoi un lien symbolique de la même manière que POSIX l'exige, les rend plus ou moins inutiles pour nous. Je l'ai déjà écrit ci-dessus.

Maintenant, les auteurs peuvent affirmer tout ce qu'ils veulent que ce soit "100% compatible" pour tout ce qui m'importe, mais un rapide coup d'œil au code source révèle que ce n'est pas le cas. Ils ne fournissent aucune solution de rechange, ils ne chargent même pas la fonction CreateSymbolicLink dynamiquement. Ainsi, le résultat sur les versions Windows non compatibles avec les liens symboliques sera un plantage avec une erreur de symbole manquante.

11
VonC

J'ai travaillé sur le support Symlink dans msysgit ici:

https://github.com/frogonwheels/git (branche mrg/symlink-v * .. actuellement v2)

Les tests ( ne se terminent pas pour le moment, et j'ai peu de temps pour y travailler, et aucun objectif à court terme réel pour me motiver. Ce serait bien de pouvoir utiliser des projets comme git-annex sous msysgit.

Mon travail est également entravé par le manque de prise en charge des liens symboliques dans le shell msys.

Il existe une ligne de commande pour accorder les privilèges suggérés par la commande cygwin ln. (Vous devrez l'exécuter en tant qu'administrateur).

editrights -a SeCreateSymbolicLinkPrivilege -a $ YOUR_USER

Tout le problème des liens symboliques entre le répertoire et les fichiers est un gros problème.

Pour le moment, je suis d'avis que, autant que possible, nous nous limitons à faire fonctionner les liens symboliques de fichiers ... et à ne pas autoriser les liens symboliques de répertoires dans msysgit. Ce n'est pas idéal, mais la réalité est que toute solution est un peu compliquée, essayer d'imposer un lien de possix sur les réalités des incompatibilités NTFS avec le lien de possix est juste douloureux.

Nous pouvons essayer de détecter si la cible est un fichier ou un répertoire, mais je peux penser à quelques problèmes avec cela juste au-dessus de ma tête - en particulier tout le problème de l'ordre dans lequel les entités sont créées.

9
frogonwheels