109 votes

Le shell Bash de Git ne parvient pas à créer des liens symboliques

Lorsque j'essaie de créer un lien symbolique à partir de l'application Git Bash La coquille, ça échoue à chaque fois, tout le temps :

ln -s /c/Users/bzisad0/Work testlink

Sortie :

ln: creating symbolic link `testlink' to `/c/Users/bzisad0/Work': Permission denied

La seule chose qu'il fait, en plus de donner le message d'erreur, est de créer un répertoire vide nommé (dans ce cas) testlink .

Je ne vois pas de problème avec le ln exécutable. Par exemple, il m'appartient et est marqué comme exécutable :

which ln
ls -hal /bin/ln

Sortie :

/bin/ln

-rwxr-xr-x    1 BZISAD0  Administ      71k Sep  5 11:55 /bin/ln

Je possède également le répertoire courant ( ~ que es /c/Users/bzisad0 ) :

ls -dhal .

Sortie :

drwxr-xr-x  115 BZISAD0  Administ      40k Sep  5 12:23 .

J'ai les droits d'administrateur et j'ai essayé d'ouvrir le shell Git Bash avec "Exécuter en tant qu'administrateur", mais cela ne fait aucune différence.

J'ai essayé d'ouvrir les propriétés de Windows pour ln.exe et en réglant le niveau de privilège sur "Exécuter ce programme en tant qu'administrateur" mais cela n'aide pas.

Je suis allé dans le Sécurité Avancé dans Windows et fait de moi (plutôt que du groupe Administrateurs) le propriétaire, mais cela ne résout rien non plus.

Je suis perdue. Je ne sais pas si ce message d'erreur provient finalement de ln depuis Bash, ou depuis Windows, ou comment je pourrais ne pas avoir la permission. Comment puis-je faire la lumière sur cette affaire ?

86voto

Mikhail Filimonov Points 653

Pour ma configuration, c'est Git pour Windows 2.11.0 installé sur Windows 8.1 , export MSYS=winsymlinks:nativestrict fait l'affaire comme expliqué sur Support Symlink #156 .

Il était important de lancer le shell Git Bash en tant qu'administrateur car sous Windows, seuls les administrateurs peuvent créer les liens symboliques.

Donc, afin de faire tar -xf et créer les liens symboliques nécessaires :

  1. Exécuter le shell Git Bash en tant qu'administrateur
  2. Exécuter export MSYS=winsymlinks:nativestrict
  3. Exécuter le goudron

85voto

Camilo Martin Points 5586

Il est possible, bien qu'extrêmement maladroit, de créer un lien symbolique dans le fichier MSysGit .

Tout d'abord, nous devons nous assurer que nous sommes sous Windows. Voici un exemple de fonction pour le vérifier :

windows() { [[ -n "$WINDIR" ]]; }

Maintenant, nous ne pouvons pas faire cmd /C car MSysGit va forniquer avec cet argument et le transformer en C: . De même, ne soyez pas tenté d'utiliser /K ; cela ne fonctionne que si vous n'avez pas de K: conduire.

Ainsi, alors qu'il remplacera cette valeur sur les arguments du programme, il ne le fera pas sur les heredocs. Nous pouvons utiliser cela à notre avantage :

if windows; then
    cmd <<< "mklink /D \"${link%/}\" \"${target%/}\"" > /dev/null
else
    ln -s "$target" "$link"
fi

Aussi : notez que j'ai inclus /D parce que je ne m'intéresse qu'aux liens symboliques de répertoire ; Windows fait cette distinction. Avec beaucoup d'efforts, vous pourriez écrire un ln() { ... } qui englobe l'API Windows et sert de solution complète, mais c'est... un exercice pour le lecteur.


En guise de remerciement pour la réponse acceptée, voici une fonction plus complète.

# We still need this.
windows() { [[ -n "$WINDIR" ]]; }

# Cross-platform symlink function. With one parameter, it will check
# whether the parameter is a symlink. With two parameters, it will create
# a symlink to a file or directory, with syntax: link $linkname $target
link() {
    if [[ -z "$2" ]]; then
        # Link-checking mode.
        if windows; then
            fsutil reparsepoint query "$1" > /dev/null
        else
            [[ -h "$1" ]]
        fi
    else
        # Link-creation mode.
        if windows; then
            # Windows needs to be told if it's a directory or not. Infer that.
            # Also: note that we convert `/` to `\`. In this case it's necessary.
            if [[ -d "$2" ]]; then
                cmd <<< "mklink /D \"$1\" \"${2//\//\\}\"" > /dev/null
            else
                cmd <<< "mklink \"$1\" \"${2//\//\\}\"" > /dev/null
            fi
        else
            # You know what? I think ln's parameters are backwards.
            ln -s "$2" "$1"
        fi
    fi
}

Notez également quelques éléments :

  1. Je viens d'écrire ceci et de le tester brièvement sur Windows 7 y Ubuntu Si vous êtes de 2015 et que vous utilisez Windows 9, essayez-le d'abord.
  2. NTFS a des points de repars et des points de jonction. J'ai choisi les points de repartition, parce qu'il s'agit plutôt d'un lien symbolique réel et qu'il fonctionne pour les fichiers ou les répertoires. Windows XP sauf que c'est juste pour les répertoires.
  3. Sur certains systèmes de fichiers, le GRAS en particulier, ne supportent pas les liens symboliques. Les versions modernes de Windows ne prennent plus en charge le démarrage à partir de ceux-ci, mais Windows et Linux peuvent les monter.

Fonction bonus : supprimer un lien.

# Remove a link, cross-platform.
rmlink() {
    if windows; then
        # Again, Windows needs to be told if it's a file or directory.
        if [[ -d "$1" ]]; then
            rmdir "$1";
        else
            rm "$1"
        fi
    else
        rm "$1"
    fi
}

31voto

Tony O'Hagan Points 1330

Une solution de contournement consiste à exécuter mklink de Bash. Cela vous permet également de créer soit un lien symbolique ou un point de jonction .

Prenez soin d'envoyer le mklink en tant qu'argument unique de la commande cmd ...

cmd /c "mklink link target"

Voici les options pour mklink ...

cmd /c mklink

Sortie :

   Creates a symbolic link.

MKLINK [[/D] | [/H] | [/J]] Link Target

    /D      Creates a directory symbolic link.  Default is a file
            symbolic link.
    /H      Creates a hard link instead of a symbolic link.
    /J      Creates a Directory Junction.
    Link    specifies the new symbolic link name.
    Target  specifies the path (relative or absolute) that the new link
            refers to.

Si vous souhaitez plutôt créer des liens via une interface graphique ... Je vous recommande Extension Link Shell qui est un Explorateur Windows pour la création de liens symboliques, liens solides les points de jonction et les points de montage des volumes. Je l'utilise depuis des années !

Extension Link Shell

Les liens symboliques peuvent vous sauver la vie si vous avez un petit disque SSD sur le disque C : de votre système et que vous avez besoin de lier symboliquement certains dossiers gonflés qui n'ont pas besoin d'être sur le SSD, mais sur d'autres disques. J'utilise le logiciel gratuit WinDirStat pour trouver les gros consommateurs d'espace disque.

19voto

Austin Hastings Points 317

Je crois que le ln qui a été livré avec MSysGit essaie simplement de copier ses arguments, plutôt que de manipuler des liens. Ceci est dû au fait que les liens ne fonctionnent (en quelque sorte) que sur NTFS et les systèmes de fichiers MSYS L'équipe ne voulait pas réimplémenter ln .

Voir, par exemple, http://mingw.5.n7.nabble.com/symbolic-link-to-My-Documents-in-MSYS-td28492.html

13voto

CervEd Points 146

Faites

Accordez-vous des privilèges pour créer des liens symboliques .

  1. Recherche de local security policies
  2. Local Policies/User Rights Assignment/Create symbolic links
  3. Prenez un moment pour gronder Windows. "Mauvais OS ! Mauvais !"
  4. Profit

Cela vous donne le privilège de créer des liens symboliques. Notez que cela prend effet lors de la prochaine connexion.

L'étape suivante consiste à trouver comment ln est configuré :

env | grep MSYS

Nous sommes à la recherche de MSYS=winsymlink: qui contrôle comment ln crée des liens symboliques.

Si la variable n'existe pas, créez-la. Notez que cela écrasera la variable existante MSYS variable d'environnement.

setx MSYS winsymlinks:nativestrict

Ne pas

Exécutez votre shell en tant qu'administrateur juste pour créer des liens symboliques.

Explication

L'erreur est assez explicite, mais insaisissable.

Vous n'avez pas les privilèges appropriés pour exécuter la commande.

Pourquoi ?

Par défaut, Windows n'accorde des droits de création de liens symboliques qu'aux administrateurs.

Cygwin doit faire une chanson et une danse pour contourner le traitement médiocre des liens symboliques par Windows.

Pourquoi ?

Quelque chose, quelque chose "sécurité"

¯\_()_/¯

Edit :

Je viens de réaliser que l'OP avait des droits d'administrateur. Je laisse cette réponse, en espérant qu'elle soit utile à d'autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X