352 votes

Symlinks Git sous Windows

Nos développeurs utilisent un mélange de systèmes d'exploitation basés sur Windows et Unix. Par conséquent, les liens symboliques créés sur des machines Unix deviennent un problème pour les développeurs Windows. Dans Windows (msysgit), le lien symbolique est converti en un fichier texte avec un chemin vers le fichier vers lequel il pointe. J'aimerais plutôt convertir le lien symbolique en un véritable lien symbolique Windows.

Le ( actualisé ) La solution que j'ai à ce problème est la suivante :

  • Ecrire un script post-checkout qui recherchera récursivement les fichiers textes "symlink".
  • Remplacez-les par un lien symbolique Windows (en utilisant mklink) avec le même nom et la même extension que le lien symbolique fictif.
  • Ignorez ces liens symboliques Windows en ajoutant une entrée dans .git/info/exclude.

Je ne l'ai pas mis en œuvre, mais je pense qu'il s'agit d'une approche solide de ce problème.

Questions :

  1. Quels inconvénients voyez-vous, le cas échéant, à cette approche ?
  2. Est-ce que ce script post-checkout est même implémentable ? C'est-à-dire que je peux trouver récursivement les fichiers "symlink" factices que git crée ?
  3. Quelqu'un a-t-il déjà travaillé sur un tel script ?

7 votes

Bien que Git supporte les liens symboliques, je vous déconseille fortement de les stocker comme liens dans votre dépôt, notamment si vous travaillez aussi avec ce code sous Windows.

4 votes

@Greg Hewgill - Je suis tout à fait d'accord avec vous. Malheureusement, la nature de notre base de code nécessite des liens symboliques... donc les supprimer n'est pas une option pour nous.

13 votes

Vous pouvez également demander sur la liste de diffusion msysgit pourquoi ils ne l'ont pas implémenté de cette manière dès le départ.

18voto

djs Points 1764

Il devrait être implémenté dans msysgit, mais il y a deux inconvénients :

  • Les liens symboliques ne sont disponibles qu'à partir de Windows Vista (cela ne devrait pas être un problème en 2011, et pourtant ça l'est...), car les versions plus anciennes ne prennent en charge que les jonctions de répertoires.
  • (le grand) Microsoft considère les liens symboliques comme un risque de sécurité et donc seuls les administrateurs peuvent les créer par défaut. Vous devrez élever les privilèges du processus git ou utiliser fstool pour modifier ce comportement sur chaque machine sur laquelle vous travaillez.

J'ai fait une recherche rapide et il y a du travail qui est fait activement sur ce sujet, voir le problème. 224 .

2 votes

Mise à jour : pour les raisons ci-dessus, le problème a été fermé en tant que wontfix. La discussion indique qu'un correctif pourrait être accepté avec un peu plus de travail sur le patch (par exemple, en utilisant les liens symboliques uniquement s'ils fonctionnent).

2 votes

A.) actuellement msysgit ne supporte pas du tout les liens symboliques -- alors pourquoi ne pas lui faire détecter "oh vous êtes sur Vista avec NTFS, laissez-moi utiliser les liens symboliques" ou "oh, vous êtes sur un OS qui supporte les jonctions avec NTFS, laissez-moi les utiliser", ou "oh, vous êtes sur Windows 98/fat32, laissez-moi me rabattre sur le fait de ne pas avoir cette fonctionnalité et de vous donner un avertissement à la place !" et ensuite B.) La quasi-totalité des outils de développement de Microsoft ne fonctionnent pas correctement (du moins pas pour toutes leurs fonctionnalités) si vous ne les exécutez pas en tant qu'administrateur -- tout le monde dans l'informatique sait que les développeurs doivent être administrateurs de leurs propres boîtes.

1 votes

Bien que j'exécute certaines machines avec le compte administrateur, je ne suis pas cette philosophie sur ma machine de développement. Je m'exécute toujours en tant qu'utilisateur normal avec l'UAC activé. Je garde une console séparée ouverte pour les opérations qui nécessitent des privilèges élevés. Pour ce qui est de l'implémentation, il faut que quelqu'un (comme vous) se porte volontaire pour l'implémenter. Les développeurs de msysgit ne sont pas connus pour leur charité...

18voto

Orangutech Points 348

Réponse courte : Ils sont maintenant bien supportés, si vous pouvez activer le mode développeur.

Desde https://blogs.Windows.com/buildingapps/2016/12/02/symlinks-Windows-10/

Maintenant, dans Windows 10 Creators Update, un utilisateur (avec des droits d'administrateur) peut activer le mode Développeur, puis tout utilisateur de la machine peut exécuter la commande la commande mklink sans élever une console de ligne de commande.

Qu'est-ce qui a motivé ce changement ? La disponibilité et l'utilisation des liens symboliques est une pour les développeurs modernes :

De nombreux outils de développement populaires comme git et des gestionnaires de paquets comme npm reconnaissent et conservent les liens symboliques lors de la création de dépôts ou de paquets, respectivement. Lorsque ces dépôts ou paquets sont ensuite restaurés sont restaurés ailleurs, les liens symboliques sont également restaurés, ce qui garantit que l'espace l'espace disque (et le temps de l'utilisateur) n'est pas gaspillé.

Facile à ignorer avec toutes les autres annonces de la "mise à jour du créateur", mais si vous activez le mode développeur, vous pouvez créer des liens symboliques sans privilèges élevés. Vous devrez peut-être réinstaller git et vous assurer que le support des liens symboliques est activé, car il ne l'est pas par défaut.

Symbolic Links aren't enabled by default

3 votes

gpedit.msc -> Local Computer Policy -> Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment a été la manière canonique d'attribuer des droits d'utilisateur tels que SeCreateSymbolicLink et amis depuis des lustres. Autre que ntrights.exe du kit de ressources ou de PowerShell...

10voto

thecoshman Points 2927

Je vous suggère de ne pas utiliser de liens symboliques dans le "repo". Stockez le contenu réel à l'intérieur du repo' et placez ensuite des liens symboliques en dehors du repo' qui pointent vers le contenu.

Disons que vous utilisez un "repo" pour comparer l'hébergement de votre site sur *nix avec l'hébergement sur win. Stockez le contenu dans votre repo', par exemple /httpRepoContent y c:\httpRepoContent ce qui est le dossier qui est synchronisé via GIT, SVN, etc.

Ensuite, remplacez le dossier de contenu de votre serveur web ( /var/www y c:\program files\web server\www {les noms n'ont pas vraiment d'importance, modifiez-les si vous le devez}) avec un lien symbolique vers le contenu de votre dépôt. Les serveurs web verront le contenu comme se trouvant au "bon" endroit, mais vous pourrez utiliser votre contrôle de source.

Cependant, si vous avez besoin d'utiliser des liens symboliques dans le "repo", vous devrez vous pencher sur quelque chose comme une sorte de scripts pré/post commit. Je sais que vous pouvez les utiliser pour faire des choses, comme analyser des fichiers de code à travers un formateur par exemple, donc il devrait être possible de convertir les liens symboliques entre les plateformes.

Si quelqu'un connaît un bon endroit pour apprendre à faire ces scripts pour les contrôles de source communs, SVN GIT MG, alors veuillez ajouter un commentaire.

0 votes

Finalement, j'ai choisi cette approche pour créer un dossier symlink-out et créer les liens symboliques là où se trouvait le fichier original. L'autre approche n'a pas fonctionné même après avoir modifié le paramètre core.symlinks = true de .git/config. Seul le fichier de liens symboliques a été enregistré dans le repo et non les données. J'ai également eu des problèmes avec l'horodatage des dossiers sur le lien symbolique, de sorte que git bash n'a jamais vu quand un fichier a changé dans le dossier.

0 votes

@Eggs ce que vous avez pu voir, je suppose, c'est que le lien était dans le repo, et donc git l'a sauvegardé, simple. Le problème cependant est que la cible était en dehors du repo, et git ne suit pas le lien vers les données cibles. Sous Linux, il existe un type de lien qui pourrait fonctionner pour cela, il permet d'avoir deux chemins vers les mêmes données stockées sur le disque ; j'ai l'impression que les nouveaux Windows peuvent le faire maintenant. De toute façon, je ne pense toujours pas que cela va faire ce que les gens veulent.

0 votes

@thecoshman Ce n'est pas une solution, mais une solution de contournement. Cependant, parfois, ce n'est pas une option. J'ai un dépôt avec git-annex et toute son architecture fonctionne grâce aux liens symboliques.

8voto

Quazistax Points 61

Voici un lot script pour convertir les liens symboliques dans le dépôt, pour les fichiers uniquement, basé sur la réponse de Josh Lee. Le script avec quelques vérifications supplémentaires pour les droits d'administrateur se trouve à l'adresse suivante https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .

@echo off
pushd "%~dp0"
setlocal EnableDelayedExpansion

for /f "tokens=3,*" %%e in ('git ls-files -s ^| findstr /R /C:"^120000"') do (
     call :processFirstLine %%f
)
REM pause
goto :eof

:processFirstLine
@echo.
@echo FILE:    %1

dir "%~f1" | find "<SYMLINK>" >NUL && (
  @echo FILE already is a symlink
  goto :eof
)

for /f "usebackq tokens=*" %%l in ("%~f1") do (
  @echo LINK TO: %%l

  del "%~f1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: del
    goto :eof
  )

  setlocal
  call :expandRelative linkto "%1" "%%l"
  mklink "%~f1" "!linkto!"
  endlocal
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: mklink
    @echo reverting deletion...
    git checkout -- "%~f1"
    goto :eof
  )

  git update-index --assume-unchanged "%1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: git update-index --assume-unchanged
    goto :eof
  )
  @echo SUCCESS
  goto :eof
)
goto :eof

:: param1 = result variable
:: param2 = reference path from which relative will be resolved
:: param3 = relative path
:expandRelative
  pushd .
  cd "%~dp2"
  set %1=%~f3
  popd
goto :eof

2 votes

Une réponse non documentée n'est pas vraiment utile lorsqu'il existe déjà des réponses aussi longues et verbeuses.

8voto

Brian White Points 2493

Pour ceux qui utilisent CygWin sur Vista, Win7, ou plus, la version native de l'interface de l'ordinateur. git peut créer des liens symboliques "corrects" qui sont reconnus par les applications Windows telles que Android Studio . Il vous suffit de définir le CYGWIN variable d'environnement à inclure winsymlinks:native o winsymlinks:nativestrict comme tel :

export CYGWIN="$CYGWIN winsymlinks:native"

L'inconvénient (et non des moindres) est que le shell CygWin doit être "exécuté en tant qu'administrateur" afin d'obtenir les autorisations d'exploitation requises pour créer ce type de liens symboliques. Une fois qu'ils sont créés, cependant, aucune autorisation spéciale n'est nécessaire pour utiliser les. Tant qu'ils ne sont pas modifiés dans le référentiel par un autre développeur, git par la suite fonctionne bien avec des autorisations d'utilisateur normales.

Personnellement, j'utilise ceci sólo pour les liens symboliques navigués par des applications Windows (c'est-à-dire non-CygWin) en raison de cette difficulté supplémentaire.

Pour plus d'informations sur cette option, voir cette question SO : Comment créer un lien symbolique avec cygwin dans Windows 7

0 votes

La documentation officielle de Cygwin décourage l'utilisation de l'option winsymlinks:native . Avec "Developer mode" semble que vous n'avez plus besoin d'exécuter avec des privilèges élevés dans vous êtes dans Windows 10.

0 votes

Ça ne m'a pas aidé, mais export MSYS=winsymlinks:nativestrict a fait

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