Comment faire pour que git suive symlinks?

j'ai eu un google pour savoir comment faire cela, mais pas eu de chance.

est-ce que mon meilleur sera un script shell qui remplacera les liens symboliques par des copies, ou y a-t-il une autre façon de dire à git de suivre les liens symboliques?

PS: je sais que ce n'est pas très sûr, mais je veux seulement le faire dans quelques cas spécifiques.

168
demandé sur Readonly 2008-09-17 22:57:36

11 réponses

NOTE: cet avis est maintenant dépassé selon le commentaire depuis git 1.6.1 . Git avait l'habitude de se comporter ainsi, et ne le fait plus.


Git par défaut des tentatives pour stocker des liens symboliques plutôt que de les suivre ( pour la compacité, et c'est généralement ce que les gens veulent )

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

c'est à dire:

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

par la pratique

 git add /bar/foo/baz

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

34
répondu Kent Fredric 2015-11-10 10:01:11

ce que j'ai fait pour ajouter pour obtenir les fichiers d'un lien symbolique dans git (Je n'ai pas utilisé de lien symbolique mais):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

exécutez cette commande dans le répertoire géré par git. TARGETDIRECTORY doit être créé avant que le SOURCEDIRECTORY soit monté à l'intérieur.

fonctionne très bien sur Linux mais pas sur OS X! ce truc m'a aussi aidé avec subversion. Je l'utilise pour inclure des fichiers d'un compte Dropbox, où un webdesigner fait son travail.

122
répondu user252400 2014-06-18 00:22:06

Pourquoi ne pas créer des liens symboliques dans l'autre sens? Ce qui signifie qu'au lieu de relier le dépôt git au répertoire d'application, il suffit de relier l'autre chemin.

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

  • j'ajoute config.conf à mon dépôt git par exemple à ~/repos/application/config.conf
  • puis je crée un lien symbolique à partir de ~/application par en cours d'exécution ln -s ~/repos/application/config.conf

cette approche peut ne pas toujours fonctionner, mais elle a bien fonctionné pour moi jusqu'à présent.

65
répondu spier 2011-04-26 07:33:43

utilisez des liens durs à la place. Ceci diffère d'un lien (symbolique) doux. Tous les programmes, y compris git traiteront le fichier comme un fichier régulier. 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à Git et Xcode installés, installez hardlink . C'est un outil microscopique pour créer des liens durs .

Pour créer du lien en dur, tout simplement:

hln source destination

macOS High Sierra update

does Apple File System support directory liens durs?

répertoire les liens durs ne sont pas supportés par le système de fichiers Apple. Tous les liens durs des répertoires sont convertis en liens symboliques ou en alias lorsque vous convertissez les formats de volumes HFS+ en APFS sur macOS.

à Partir de FAQ sur les fpa developer.apple.com

Suivre https://github.com/selkhateeb/hardlink/issues/31 pour l'avenir des solutions de rechange.

Sur Linux et les autres Unix

la commande ln peut faire des liens durs:

ln source destination

Sur Windows (Vista, 7, 8, ...)

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

mklink /j "source" "destination"
41
répondu bfred.it 2017-11-12 08:17:15

il s'agit d'un pre-commit hook qui remplace les blobs de lien symbolique dans l'index, avec 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 ""; diff -au /dev/null "" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

Notes

nous utilisons autant que possible les fonctionnalités conformes à POSIX; cependant, diff -a n'est pas conforme à POSIX, peut-être entre autres choses.

il peut y avoir des erreurs dans ce code, bien qu'il ait été testé quelque peu.

16
répondu Abbafei 2014-04-08 02:27:43

j'ai utilisé pour ajouter des fichiers au-delà des liens symboliques pendant un certain temps maintenant. Cela fonctionne très bien, sans faire de régime particulier. Depuis que j'ai mis à jour git 1.6.1, cela ne fonctionne plus.

vous pourriez être en mesure de passer à git 1.6.0 Pour faire ce travail. J'espère qu'une future version de git aura un drapeau à git-ajouter lui permettant de suivre les liens symboliques de nouveau.

12
répondu Erik Schnetter 2015-08-03 19:31:09

avec Git 2.3.2+ (Q1 2015), il y a un autre cas où Git va Non suivre symlink anymore: voir commit e0d201b par Junio C Hamano ( gitster ) (main Git maintainer)

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

parce que Git trace des liens symboliques comme des liens symboliques, un chemin qui a un lien symbolique dans son la partie principale (par exemple 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'arbre 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 à un répertoire d'y être créé.

Détecter et rejeter un tel patch.

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

à la place, pour n'importe quel patch dans l'entrée qui laisse un chemin (c.-à-d. Une Non suppression) dans le résultat, nous vérifions tous les chemins de tête contre l'arbre résultant que le patch créerait en inspectant tous les patches dans l'entrée et puis la cible de l'application de patch (soit l'index ou l'arbre de travail).

Par Ici, nous:

  • attraper un méfait ou une erreur d'ajouter un lien symbolique path/to/dir et un fichier path/to/dir/file en même temps,
  • tout en autorisant un correctif valide qui supprime un symbole link path/to/dir et ajoute ensuite un fichier path/to/dir/file .

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

affected file '%s' is beyond a symbolic link
6
répondu VonC 2015-03-04 06:39:40

hmmm mount -- bind ne semble pas fonctionner sur Darwin.

quelqu'un aurait-il une astuce?

[édité]

OK j'ai trouvé la réponse sur OSX est de faire un lien dur. Sauf que cette API n'est pas exposée via ln donc vous devez utiliser votre propre programme minuscule pour le faire. Voici un lien vers ce programme:

créer un répertoire liens durs dans MacOS X?

Profitez-en!

4
répondu J Chris A 2017-05-23 12:10:43

je me suis lassé de chaque solution ici soit étant obsolète ou nécessitant root, donc j'ai fait une solution basée LD_PRELOAD .

4
répondu Alcaro 2018-03-06 19:27:37

j'utilise git 1.5.4.3 et il suit le lien symbolique passé s'il a une barre oblique. Par exemple:

# adds the symlink itself 
$ git add symlink 

# follows symlink and adds denoted directory's contents
$ git add symlink/ 
2
répondu 2009-07-29 12:29:46

la Conversion de liens symboliques serait utile? lien dans le dossier git à la place d'un lien symbolique, par un script

0
répondu Yurij73 2012-08-19 19:37:54