Question

Mon meilleur sera-t-il un script shell 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écurisé, mais je souhaite le faire uniquement dans quelques cas spécifiques.

Était-ce utile?

La solution

REMARQUE: ce conseil est désormais obsolète, comme indiqué dans les commentaires depuis Git 1.6.1. Git se comportait de cette façon et ne le fait plus.

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

Cependant, j'ai accidentellement réussi à le faire pour ajouter des fichiers au-delà du lien symbolique lorsque le lien symbolique est un répertoire.

I.e.:

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

en faisant

 git add /bar/foo/baz

cela a semblé fonctionner quand je l'ai essayé. Ce comportement était cependant indésirable pour moi à ce moment-là, donc je ne peux pas vous donner d'informations au-delà de cela.

Autres conseils

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

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Faites cette commande dans le répertoire géré par Git. TARGETDIRECTORY doit être créé avant que le SOURCEDIRECTORY ne soit monté.

Cela fonctionne bien sous Linux, mais pas sous OS & nbsp; 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.

Pourquoi ne pas créer des liens symboliques dans l’inverse? Au lieu de créer un lien entre le référentiel Git et le répertoire de l’application, il vous suffit de relier l’inverse.

Par exemple, supposons que & # 8217; s soit en train de configurer une application installée dans ~/application nécessitant un fichier de configuration config.conf:

  • J'ajoute ~/repos/application/config.conf à mon référentiel Git, par exemple à ln -s ~/repos/application/config.conf.
  • Ensuite, je crée un lien symbolique à partir de <=> en exécutant <=>.

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

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

Sur macOS (avant 10.13 High Sierra)

Si vous avez déjà installé git et Xcode, installez hardlink . Il s'agit d'un outil microscopique permettant de créer des liens physiques .

Pour créer le lien dur, il suffit de:

hln source destination

Mise à jour macOS High Sierra

  

Apple File System prend-il en charge les liens physiques dans les répertoires?

     

Les liens physiques dans les répertoires ne sont pas pris en charge par Apple File System. Tous les liens physiques d’annuaire sont convertis en liens symboliques ou en alias lors de la conversion du format de volume HFS + en format de volume APFS sous macOS.

     

De FAQ APFS sur le développeur .apple.com

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

Sous Linux et autres variétés Unix

La commande ln peut créer des liens physiques:

ln source destination

Sous Windows (Vista, 7, 8, & # 8230;)

Quelqu'un a suggéré d'utiliser mklink pour créer une jonction sous Windows, mais je ne l'ai pas essayé. :

mklink /j "source" "destination"

Ceci est un point d'ancrage de pré-validation qui remplace les blobs de lien symbolique dans l'index par le contenu de ces liens symboliques.

Mettez ceci dans .git/hooks/pre-commit et rendez-le exécutable:

#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)

# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
    'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

Notes

Nous utilisons autant que possible les fonctionnalités compatibles POSIX; Cependant, diff -a n'est pas compatible POSIX, éventuellement entre autres choses.

Il peut y avoir des erreurs / erreurs dans ce code, même s'il a été testé quelque peu.

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

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

J'étais fatigué de voir que chaque solution proposée ici était obsolète ou nécessitait l'utilisation de root. j'ai créé une solution basée sur LD_PRELOAD. (Linux uniquement).

Il s'accroche aux éléments internes de Git, en remplaçant l'option "Est-ce un lien symbolique?" fonction, permettant aux liens symboliques d'être traités comme leur contenu. Par défaut, tous les liens hors du référentiel sont en ligne. voir le lien pour plus de détails.

Avec Git 2.3.2+ (T1 2015), il existe un autre cas où Git pas suivez plus le lien symbolique :voir commettre e0d201b par Junio ​​C Hamano (gitster) (mainteneur principal de Git)

apply:ne touchez pas à un fichier au-delà d'un lien symbolique

Étant donné que Git suit les liens symboliques en tant que liens symboliques, un chemin comportant un lien symbolique dans sa partie principale (par ex. path/to/dir/file, où path/to/dir est un lien symbolique vers un autre endroit, que ce soit à l'intérieur ou à l'extérieur de l'arborescence de travail) ne peut jamais apparaître dans un patch qui s'applique valablement, à moins que le même patch ne supprime d'abord le lien symbolique pour permettre la création d'un répertoire à cet endroit.

Détectez et rejetez un tel correctif.

De même, lorsqu'une entrée crée un lien symbolique path/to/dir puis crée un fichier path/to/dir/file, nous devons le signaler comme une erreur sans réellement créer path/to/dir lien symbolique dans le système de fichiers.

Au lieu de cela, pour tout patch dans l'entrée qui laisse un chemin (c'est-à-direune non suppression) dans le résultat, nous vérifions tous les chemins principaux par rapport à l'arborescence résultante que le correctif créerait en inspectant tous les correctifs dans l'entrée puis la cible de l'application du correctif (soit l'index, soit l'arborescence de travail).

De cette façon, nous :

  • détecter un méfait ou une erreur pour ajouter un lien symbolique path/to/dir et un fichier path/to/dir/file en même temps,
  • tout en autorisant un patch valide qui supprime un symbolique link path/to/dir puis ajoute un fichier path/to/dir/file.

Cela signifie que, dans ce cas, le message d'erreur ne sera pas générique comme "%s: patch does not apply", mais un plus précis :

affected file '%s' is beyond a symbolic link

Hmmm, mount --bind ne semble pas fonctionner sur Darwin.

Quelqu'un at-il un truc qui a?

[édité]

Bien, j'ai trouvé la réponse sur Mac & nbsp; OS & nbsp; X consiste à créer un lien physique. Sauf que cette API n'est pas exposée via ln, vous devez donc utiliser votre propre petit programme pour le faire. Voici un lien vers ce programme:

Création de liens physiques dans les répertoires sous Mac OS X

Profitez!

Sur MacOS (j'ai Mojave / 10.14, git version 2.7.1), utilisez bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

Cela a été suggéré par d'autres commentaires, mais pas clairement indiqué dans d'autres réponses. Espérons que cela économise du temps à quelqu'un.

J'utilise Git 1.5.4.3 et il suit le lien symbolique passé s'il comporte une barre oblique finale. Ex.

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/

La conversion à partir de liens symboliques pourrait être utile. Lien dans un dossier Git au lieu d'un lien symbolique par un script .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top