271 votes

Comment puis-je faire en sorte que Git suive les liens symboliques ?

Est-ce que ma meilleure solution sera un shell script qui remplace les liens symboliques par des copies, ou existe-t-il un autre moyen de dire à Git de suivre les liens symboliques ?

PS : Je sais que ce n'est pas très sûr, mais je ne veux le faire que dans quelques cas précis.

7 votes

Y a-t-il un inconvénient à utiliser des liens physiques pour quelque chose comme ça ?

14 votes

Avec Windows 7, "mklink /d" (lien symbolique de répertoire) ne fonctionne pas avec git, mais "mklink /j" (juction) fonctionne bien.

3 votes

Si le fichier est autogénéré par une application qui le régénère de telle sorte qu'elle supprime le fichier et en crée un nouveau, alors oui, c'est un problème que les liens en dur vers les fichiers ne résoudront pas.

180voto

user252400 Points 829

Ce que j'ai fait pour ajouter pour obtenir les fichiers dans un lien symbolique dans Git (je n'ai pas utilisé un lien symbolique mais) :

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Effectuez cette commande dans le répertoire géré par Git. TARGETDIRECTORY doit être créé avant que le SOURCEDIRECTORY est monté dans celui-ci.

Il fonctionne bien sous Linux, mais pas sous OS X ! Cette astuce m'a aussi aidé avec Subversion. Je l'utilise pour inclure des fichiers d'un compte Dropbox, où un webdesigner fait son travail.

14 votes

Ce serait une très bonne approche si sudo n'était pas nécessaire.

16 votes

Pour annuler cette liaison, utilisez umount [mydir] . (+1 pour votre excellent conseil, @user252400)

11 votes

Cela ne fonctionne que pendant la session. Quelle est la meilleure façon de le rendre "éternel" ?

90voto

spier Points 1116

Pourquoi ne pas créer des liens symboliques dans l'autre sens ? C'est-à-dire qu'au lieu de créer un lien du dépôt Git vers le répertoire de l'application, il suffirait de créer un lien dans l'autre sens.

Par exemple, disons que je suis en train de configurer une application installée en ~/application qui a besoin d'un fichier de configuration config.conf :

  • J'ajoute config.conf à mon dépôt Git, par exemple, à l'adresse suivante ~/repos/application/config.conf .
  • Ensuite, je crée un lien symbolique à partir de ~/application en courant ln -s ~/repos/application/config.conf .

Cette approche ne fonctionne peut-être pas toujours, mais elle a bien fonctionné pour moi jusqu'à présent.

5 votes

Cela semble être le seul moyen, et ce n'est pas si mal... je pense que votre approche est assez élégante. git suit le contenu, pas les fichiers. Donc garder tout le contenu ensemble et faire des liens symboliques à partir de là vers d'autres endroits est logique.

17 votes

Dans mon cas, je voulais un lien d'un dépôt git à un autre, de sorte que je puisse éditer des fichiers dans l'un ou l'autre emplacement et les renvoyer dans leurs dépôts respectifs. Sous Windows 7, une jonction ("mklink /j") a fait l'affaire.

3 votes

Bien sûr. Parfois, la réponse est aussi simple que ça.

65voto

bfred.it Points 2384

Utilisez plutôt des liens solides. Cela diffère d'un lien souple (symbolique). Tous les programmes, y compris git traitera le fichier comme un fichier normal. Notez que le contenu peut être modifié en changeant soit la source ou la destination.

Sur macOS (avant 10.13 High Sierra)

Si vous avez déjà installé git et Xcode, installer hardlink . C'est un microscopique outil pour créer des liens durs .

Pour créer le lien dur, il suffit :

hln source destination

Mise à jour de macOS High Sierra

Le système de fichiers Apple prend-il en charge les liens durs de répertoire ?

Les liens durs de répertoire ne sont pas pris en charge par le système de fichiers Apple. Tous les liens durs de répertoire sont convertis en liens symboliques ou en alias lorsque vous convertissez les formats de volume HFS+ en APFS sur macOS.

_De APFS FAQ sur developer.apple.com_

Suivez https://github.com/selkhateeb/hardlink/issues/31 pour des alternatives futures.

Sur Linux et les autres versions d'Unix

El ln La commande peut faire des liens durs :

ln source destination

Sous Windows (Vista, 7, 8, )

Utilice mklink pour créer une jonction sur Windows :

mklink /j "source" "destination"

0 votes

Ceci est seulement pour HFS/HFS+ sur osX !

8 votes

Juste une note : c'est essentiellement ce que je cherchais, mais j'ai ensuite appris que sous Linux, un lien dur ne peut malheureusement pas traverser les frontières du système de fichiers (ce qui est mon cas d'utilisation).

0 votes

Cette approche ne fonctionnera pas si votre cible a un lien symbolique dans son chemin.

46voto

Kent Fredric Points 35592

NOTE : Ce conseil est maintenant dépassé par les commentaires depuis Git 1.6.1. Git se comportait de cette manière et ne le fait plus.


Par défaut, Git essaie de stocker les liens symboliques au lieu de les suivre (pour des raisons de compacité, et c'est généralement ce que les gens veulent).

Cependant, j'ai accidentellement réussi à faire en sorte qu'il ajoute des fichiers au-delà du lien symbolique lorsque celui-ci est un répertoire.

C'est-à-dire :

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

en faisant

 git add /bar/foo/baz

ça semblait fonctionner quand je l'ai essayé. Ce comportement n'était cependant pas souhaité par moi à l'époque, je ne peux donc pas vous donner d'autres informations.

77 votes

Les commits 725b06050a083474e240a2436121e0a80bb9f175 et 806d13b1ccdbdde4bbdfb96902791c4b7ed125f6 ont introduit des changements qui empêchent d'ajouter des fichiers au-delà des répertoires liés par des liens symboliques, donc cela ne fonctionnera pas dans les versions de git depuis 1.6.1.

1 votes

$ git add src/main/path/ConvertSymlinkToDir fatal : 'src/main/path/ConvertSymlinkToDir' est au-delà d'un lien symbolique

2 votes

@user1767316 lisez l'article en entier, et les commentaires. Ça marchait avant, ça ne marche plus. Les logiciels changent, mais les réponses acceptées par stack-overflow ne changent pas. J'ai déjà clarifié que cela ne fonctionne pas. Regardez une autre réponse.

15voto

Erik Schnetter Points 156

J'ai l'habitude d'ajouter des fichiers au-delà des liens symboliques depuis un certain temps déjà. Cela fonctionnait très bien, sans avoir à prendre de dispositions particulières. Depuis que j'ai mis à jour vers Git 1.6.1, cela ne fonctionne plus.

Vous pouvez peut-être passer à Git 1.6.0 pour que cela fonctionne. J'espère qu'une future version de Git aura un drapeau pour git-add lui permettant de suivre les liens symboliques à nouveau.

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