Que se passe-t-il lorsque je clone un dépôt avec des liens symboliques sur Windows?

il y a eu beaucoup de questions sur l'ajout du support pour les liens symboliques sur Windows. Mais, que se passe-t-il réellement quand je clone un dépôt avec des liens symboliques sur Windows?

40

3 réponses

depuis version 1.5.3 du client natif Git git clone et git init sondera le système de fichiers cible pour le support de symlink et définira la configuration du dépôt local pour core.symlinks en conséquence, i.e. à false pour FAT ou NTFS. Cela fait apparaître les liens symboliques créés et engagés, par exemple sous Linux, comme des fichiers texte qui contiennent le lien texte sous Windows (voir la documentation de configuration git sur core.symlinks pour plus de détails).

depuis Git for Windows version 2.10.2 l'installateur a une option explicite pour activer le support du lien symbolique .

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

  • les liens symboliques ne sont disponible sur Windows Vista et les versions ultérieures.
  • les liens symboliques ne fonctionneront que sur NTFS, pas sur FAT.
  • Vous devez être un administrateur et / ou avoir la SeCreateSymbolicLinkPrivilege privilège.
  • liens Symboliques sur les systèmes de fichiers distants sont désactivés par défaut.
  • les liens symboliques de Windows sont dactylographiés.
  • de nombreux programmes ne comprennent pas les liens symboliques (qui inclut L'ancienne version de Windows Explorer).

plus détails sont disponibles dans le Git pour Windows wiki.

dans les versions plus anciennes de Git pour Windows réglage manuel de core.symlinks manuellement à true après le clonage et réinitialiser votre arbre de travail, vous obtiendriez 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'.

comme note secondaire, le client JGit n'a pas sondé le système de fichiers cible pour le support de symlink avant sa version 3.3, de sorte que le Le réglage de core.symlinks retombait sur la configuration système / git globale. En commençant par version 3.3 les sondes JGit pour le soutien de symlink mais semblent être trop conservatrices, le réglage core.symlinks = false dans certains cas où symlinks serait en fait soutenu .

vous pouvez aller à la caisse https://github.com/sschuberth/git-playground qui contient un tas de liens créés sur Linux pour test.

39
répondu sschuberth 2017-09-27 06:04:27

une solution aurait un filtre afin de détecter les liens symboliques stockés par Git et de les remplacer par Windows symlink.

C'est détaillée dans le " Git liens symboliques sous Windows "

cependant, le vrai support de symlink n'est pas seulement pour le moment:

Voir numéro 224 et la très récente (juillet 2012) discussion sur GitHub (que vous avez regardé):

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

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

pour pré-Vista, nous aurions besoin d'un repli qui crée soit des liens durs pour les fichiers utilisant" fsutil hardlink " (mais probablement seulement si " ln "est appelé sans" -s ") et crée des jonctions pour les répertoires utilisant" fsutils reparsepoint ", ou appelle simplement l'original ln.exe .

en plus de casser les configurations Windows XP, un changement comme celui-ci cassera aussi les configurations standard de Windows 7, parce que 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 retournant à la copie dans de tels cas.

juste pour information: j'ai joué un peu avec essayer de faire le support de symlink dans Git pour Windows lui-même récemment, mais j'ai fini par conclure que le "soutien de symlink" dans Windows 7 et plus est assez proche de inutile pour émuler des liens symboliques Unix.

il y a un projet qui déclare Open Source, 100% Compatible ln for Windows (and Junction Point library) ", mais:

malheureusement, les utilisateurs normaux n'ont pas les permissions requises pour créer des liens symboliques par défaut sur Windows. Combinez cela avec le fait que vous ne pouvez pas changer symlink indique de la même manière que POSIX exige, les rend plus ou moins inutiles pour nous. Ce que j'ai déjà écrit ci-dessus.

maintenant, les auteurs peuvent prétendre tout ce qu'ils veulent que ce soit "100% compatible" pour tout ce que je me soucie, mais un rapide coup d'oeil au code source révèle que ce n'est pas. Ils ne fournissent aucune retombée, ils ne chargent même pas dynamiquement la fonction CreateSymbolicLink . Ainsi, le résultat sur les versions Windows non-symlink capable sera un crash avec une erreur de symbole manquante.

11
répondu VonC 2017-05-23 11:47:12

j'ai travaillé sur Symlink support dans msysgit ici:

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

Les tests ne sont pas exécuter jusqu'à la fin encore, et j'ai peu de temps pour faire le travail, et pas de réel objectif à court terme pour me motiver. Ce serait bien de pouvoir utiliser des projets comme git-annex sous msysgit.

mon travail est gêné par le manque de support pour le lien symbolique dans le shell msys.

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

editorights -a SeCreateSymbolicLinkPrivilege-a $YOUR_USER

tout le problème du répertoire vs symlinks de fichiers est un gros problème.

En ce moment je suis de l' nous pensons que, autant que nous le pouvons, nous nous limitons à faire fonctionner les liens de fichiers... et ne pas autoriser les liens répertoires dans msysgit. Ce n'est pas idéal, mais la réalité est que toute solution est un peu un cludge, essayer d'imposer possix lien sur les réalités des incompatibilités NTFS avec possix lien 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 créées.

9
répondu frogonwheels 2012-08-03 04:31:43