Nos développeurs utilisent un mélange de systèmes d'exploitation Windows et Unix. Par conséquent, les liens symboliques créés sur les machines Unix deviennent un problème pour les développeurs Windows. Dans Windows (msysgit), le lien symbolique est converti en fichier texte avec un chemin d'accès au fichier vers lequel il pointe. Au lieu de cela, j'aimerais convertir le lien symbolique en un véritable lien symbolique Windows.
La solution ( mise à jour ) dont je dispose est la suivante:
- Écrivez un script de post-paiement qui recherchera récursivement les fichiers texte "symlink".
- Remplacez-les par un lien symbolique Windows (en utilisant mklink) avec le même nom et l'extension que le "lien symbolique" factice
- 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 que c'est une approche solide de ce problème.
Des questions:
- Quels sont, le cas échéant, les inconvénients de cette approche?
- Ce script post-paiement est-il même implémentable? Est-ce que je peux récursivement trouver les fichiers factices "symlink" créés par git?
- Quelqu'un a-t-il déjà travaillé sur un tel script?
Réponses:
Vous pouvez trouver les liens symboliques en recherchant des fichiers qui ont un mode de
120000
, éventuellement avec cette commande:Une fois que vous avez remplacé les liens, je recommanderais de les marquer comme inchangés
git update-index --assume-unchanged
, plutôt que de les répertorier.git/info/exclude
.la source
git ls-files -s | grep '^12' | cut -f2
(deuxième colonne délimitée par des tabulations; d'autres colonnes sont délimitées par des espaces)for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
Je posais cette même question il y a quelque temps (pas ici, juste en général) et j'ai fini par trouver une solution très similaire à la proposition de OP. Je vais d'abord répondre directement aux questions 1, 2 et 3, puis je publierai la solution que j'ai finalement utilisée.
git checkout
étape littérale , mais la solution ci-dessous a suffisamment bien répondu à mes besoins pour qu'un script de post-paiement littéral ne soit pas nécessaire.La solution:
Nos développeurs sont à peu près dans la même situation que OP: un mélange d'hôtes, de référentiels et de sous-modules de type Windows et Unix avec de nombreux liens symboliques git, et aucun support natif (pour l'instant) dans la version finale de MsysGit pour gérer intelligemment ces liens symboliques sur les hôtes Windows. .
Merci à Josh Lee d'avoir souligné le fait que git valide les liens symboliques avec un mode de fichier spécial
120000
. Avec ces informations, il est possible d'ajouter quelques alias git qui permettent la création et la manipulation de liens symboliques git sur les hôtes Windows.Création de liens symboliques git sous Windows
Utilisation:,
git add-symlink <source_file_or_dir> <target_symlink>
où l'argument correspondant au fichier ou répertoire source doit prendre la forme d'un chemin relatif au lien symbolique cible. Vous pouvez utiliser cet alias de la même manière que vous le feriez normalementln
.Par exemple, l'arborescence du référentiel:
Peut être créé sous Windows comme suit:
Remplacement des liens symboliques git par des liens durs + jonctions NTFS
Usage:
Cet alias peut supprimer les liens symboliques git un par un ou tout à la fois d'un seul coup. Les liens symboliques seront remplacés par des liens durs NTFS (dans le cas des fichiers) ou des jonctions NTFS (dans le cas des répertoires). L'avantage de l'utilisation de liens durs + jonctions par rapport aux "vrais" liens symboliques NTFS est que des autorisations UAC élevées ne sont pas nécessaires pour les créer.
Pour supprimer les liens symboliques des sous-modules, utilisez simplement le support intégré de git pour les parcourir:
Mais, pour chaque action drastique comme celle-ci, une inversion est agréable d'avoir ...
Restauration de liens symboliques git sous Windows
Utilisation
git checkout-symlinks [symlink] [symlink] [...]
:, qui annulegit rm-symlinks
, restaurer efficacement le référentiel à son état naturel (à l'exception de vos modifications, qui doivent rester intactes).Et pour les sous-modules:
Limites:
Les répertoires / fichiers / liens symboliques avec des espaces dans leurs chemins devraient fonctionner. Mais onglets ou nouvelles lignes? YMMV… (J'entends par là: ne fais pas ça, car ça ne marchera pas .)
Si vous-même ou d'autres oubliez
git checkout-symlinks
avant de faire quelque chose avec des conséquences potentiellement étendues commegit add -A
, le référentiel local pourrait se retrouver dans un état pollué.En utilisant notre "exemple de dépôt" d'avant:
Oups ...
Pour cette raison, il est agréable d'inclure ces alias comme étapes à effectuer pour les utilisateurs Windows avant et après la création d'un projet, plutôt qu'après l'extraction ou avant de pousser. Mais chaque situation est différente. Ces alias m'ont été suffisamment utiles pour qu'une vraie solution post-paiement ne soit pas nécessaire.
J'espère que cela pourra aider!
Références:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
Dernière mise à jour: 2019-03-13
mklink
appels, bien sûr) - plus de bashismes !add-symlink
alias fonctionne désormais plus comme ln (1) et peut être utilisé à partir de n'importe quel répertoire du référentiel, pas seulement du répertoire racine du référentiel.rm-symlink
alias (singulier) a été remplacé par l'rm-symlinks
alias (pluriel), qui accepte désormais plusieurs arguments (ou aucun argument du tout, qui trouve tous les liens symboliques dans le référentiel, comme auparavant) pour transformer sélectivement les liens symboliques git en liens durs NTFS + jonctions .checkout-symlinks
alias a également été mis à jour pour accepter plusieurs arguments (ou aucun, == tout) pour une inversion sélective des transformations susmentionnées.Remarque finale: Bien que j'ai testé le chargement et l'exécution de ces alias à l'aide de Bash 3.2 (et même 3.1) pour ceux qui peuvent encore être bloqués sur de telles versions anciennes pour un certain nombre de raisons, sachez que des versions aussi anciennes que celles-ci sont connues pour leur analyseur. Bugs. Si vous rencontrez des problèmes lors de l'installation de l'un de ces alias, la première chose à faire est de mettre à niveau votre shell (pour Bash, vérifiez la version avec CTRL + X, CTRL + V). Alternativement, si vous essayez de les installer en les collant dans votre émulateur de terminal, vous aurez peut-être plus de chance de les coller dans un fichier et de les sourcer à la place, par exemple en tant que
Bonne chance!
la source
git add-symlink
recette a été incroyablement précieuse pour moi. Merci beaucoup.La version la plus récente de git scm (testet 2.11.1) permet d'activer les liens symboliques. Mais vous devez à nouveau cloner le référentiel avec les liens symboliques
git clone -c core.symlinks=true <URL>
. Vous devez exécuter cette commande avec des droits d'administrateur. Il est également possible de créer des liens symboliques sous Windows avec mklink. Consultez le wiki .la source
tslint.json
fichier référençant le fichier dans le répertoire parent contient toujours../tslint.json
. Dommage, car cela ressemblait vraiment à la plus simple de toutes les solutions proposées.git clone -c core.symlinks=true <URL>
Et sous Windows, vous devez l'exécuter avec des droits d'administrateur.Il devrait être implémenté dans msysgit, mais il y a deux inconvénients:
J'ai fait une recherche rapide et il y a un travail activement fait à ce sujet, voir le numéro 224 .
la source
Donc, comme les choses ont changé avec GIT depuis que beaucoup de ces réponses ont été publiées, voici les instructions correctes pour que les liens symboliques fonctionnent correctement dans Windows à partir de
AOÛT 2018
1. Assurez-vous que git est installé avec le support de symlink
2. Dites à Bash de créer des liens physiques au lieu de liens symboliques
EDIT - (dossier git) /etc/bash.bashrc
AJOUTER AU FOND -
MSYS=winsymlinks:nativestrict
3. Définissez git config pour utiliser des liens symboliques
ou
REMARQUE: j'ai essayé d'ajouter ceci à la configuration globale de git et pour le moment cela ne fonctionne pas pour moi, donc je recommande d'ajouter ceci à chaque dépôt ...
4. tirez sur le repo
REMARQUE: sauf si vous avez activé le mode développeur dans la dernière version de Windows 10, vous devez exécuter bash en tant qu'administrateur pour créer des liens symboliques
5. Réinitialiser tous les liens symboliques (facultatif) Si vous avez un référentiel existant ou utilisez des sous-modules, vous pouvez constater que les liens symboliques ne sont pas créés correctement. Pour actualiser tous les liens symboliques du référentiel, vous pouvez exécuter ces commandes.
REMARQUE: cela réinitialisera toutes les modifications depuis la dernière validation, assurez-vous donc que vous avez validé en premier
la source
Réponse courte: ils sont désormais bien pris en charge, si vous pouvez activer le mode développeur.
Depuis https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/
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 la prise en charge des liens symboliques est activée, car ce n'est pas le cas par défaut.
la source
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 commeSeCreateSymbolicLink
et amis depuis des lustres. Autre quentrights.exe
du Kit de ressources ou du PowerShell ...2020 Réponse
mklink
autorisationsgit config --global core.symlinks true
Changer de branche forcera la recréation des liens symboliques manquants.
Attention, la prise en charge de Symlinks sous Windows avec certains autres clients Git n'est pas complète. Notamment GitKraken.
la source
Je vous suggère de ne pas utiliser de liens symboliques dans le repo '. Stockez le contenu réel à l'intérieur du référentiel ', puis placez des liens symboliques à l'extérieur du référentiel' qui pointent vers le contenu.
Supposons donc que vous utilisez un référentiel pour comparer l'hébergement de votre site sur * nix avec l'hébergement sur win. Stockez le contenu dans votre repo ', disons
/httpRepoContent
etc:\httpRepoContent
avec cela étant le dossier qui est synchronisé via GIT, SVN etc.Ensuite, remplacez le dossier de contenu de votre serveur Web (
/var/www
etc:\program files\web server\www
{les noms n'ont pas vraiment d'importance, modifiez si vous devez}) par un lien symbolique vers le contenu de votre référentiel '. Les serveurs Web verront le contenu comme étant au bon endroit, mais vous pourrez utiliser votre contrôle de code source.Cependant, si vous devez utiliser des liens symboliques avec dans le repo ', vous devrez examiner quelque chose comme une sorte de scripts de pré / post-commit. Je sais que vous pouvez les utiliser pour faire des choses, comme analyser des fichiers de code via un formateur par exemple, il devrait donc être possible de convertir les liens symboliques entre les plates-formes.
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.
la source
Pour ceux qui utilisent CygWin sur Vista, Win7 ou supérieur, la
git
commande native peut créer des liens symboliques "appropriés" qui sont reconnus par les applications Windows telles que Android Studio . Il vous suffit de définir laCYGWIN
variable d'environnement pour inclurewinsymlinks:native
ou enwinsymlinks:nativestrict
tant que telle:L'inconvénient de cela (et un aspect significatif à ce sujet) est que le shell CygWin doit être «Exécuter en tant qu'administrateur» pour qu'il dispose des autorisations du système 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 requise pour les utiliser . Tant qu'ils ne sont pas modifiés dans le référentiel par un autre développeur,
git
s'exécute ensuite correctement avec les autorisations utilisateur normales.Personnellement, je l'utilise uniquement pour les liens symboliques qui sont parcourus par les applications Windows (c'est-à-dire non CygWin) en raison de cette difficulté supplémentaire.
Pour plus d'informations sur cette option, consultez cette question SO: Comment créer un lien symbolique avec cygwin dans Windows 7
la source
Voici un script batch pour convertir les liens symboliques dans le référentiel, pour les fichiers uniquement, basé sur la réponse de Josh Lee. Le script avec une vérification supplémentaire des droits d'administrateur se trouve à https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .
la source
J'utilise des liens sym tout le temps entre ma racine de document et mon répertoire git repo. J'aime les garder séparés. Sous Windows, j'utilise l'option mklink / j. La jonction semble laisser git se comporter normalement:
>mklink /j <location(path) of link> <source of link>
par exemple:
>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts
la source
Je cherchais une solution simple pour gérer les liens symboliques Unix sur Windows. Merci beaucoup pour les alias Git ci-dessus. Il y a une petite optimisation qui peut être faite pour les liens rm-sym afin qu'il ne supprime pas les fichiers dans le dossier de destination au cas où l'alias serait exécuté une seconde fois accidentellement. Veuillez observer la nouvelle condition if dans la boucle pour vous assurer que le fichier n'est pas déjà un lien vers un répertoire avant l'exécution de la logique.
la source
Une astuce simple que nous utilisons consiste à simplement appeler
git add --all
deux fois de suite.Par exemple, nos appels de script de validation Windows 7:
Le premier ajout traite le lien comme du texte et ajoute les dossiers à supprimer.
Le deuxième ajout traverse correctement le lien et annule la suppression en restaurant les fichiers.
C'est moins élégant que certaines des autres solutions proposées, mais c'est une solution simple à certains de nos environnements hérités auxquels des liens symboliques ont été ajoutés.
la source