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.
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.
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.
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écutionln -s ~/repos/application/config.conf
cette approche peut ne pas toujours fonctionner, mais elle a bien fonctionné pour moi jusqu'à présent.
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"
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.
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.
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 fichierpath/to/dir/file
, nous devons la marquer comme une erreur sans créer réellement le lien symboliquepath/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 fichierpath/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 fichierpath/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
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!
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 .
la Conversion de liens symboliques serait utile? lien dans le dossier git à la place d'un lien symbolique, par un script