Est-ce que mon mieux sera un script shell qui remplace les liens symboliques par des copies, ou existe-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écurisé, mais je ne veux le faire que dans quelques cas spécifiques.
Réponses:
REMARQUE: cet avis est désormais obsolète selon le commentaire depuis Git 1.6.1. Git se comportait de cette façon et ne le fait plus.
Git essaie par défaut 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 ajouter des fichiers au-delà du lien symbolique lorsque le lien symbolique est un répertoire.
C'est à dire:
en faisant
cela a semblé fonctionner quand je l'ai essayé. Ce comportement n'était cependant pas souhaité par moi à l'époque, donc je ne peux pas vous donner d'informations au-delà de cela.
la source
Ce que j'ai fait pour ajouter les fichiers d'un lien symbolique dans Git (je n'ai pas utilisé de lien symbolique mais):
Exécutez cette commande dans le répertoire géré par Git.
TARGETDIRECTORY
doit être créé avant d'SOURCEDIRECTORY
y être monté.Cela fonctionne bien sous Linux, mais pas sous OS X! Cette astuce m'a également aidé avec Subversion. Je l'utilise pour inclure des fichiers à partir d'un compte Dropbox, où un webdesigner fait son travail.
la source
umount [mydir]
. (+1 pour votre excellent conseil, @ user252400)Pourquoi ne pas créer des liens symboliques dans l'autre sens? Au lieu de lier le référentiel Git au répertoire d'application, il suffit de lier l'inverse.
Par exemple, disons que je configure une application installée dans
~/application
qui a besoin d'un fichier de configurationconfig.conf
:config.conf
à mon référentiel Git, par exemple, à~/repos/application/config.conf
.~/application
en cours d'exécutionln -s ~/repos/application/config.conf
.Cette approche peut ne pas toujours fonctionner, mais elle a bien fonctionné jusqu'à présent.
la source
Utilisez plutôt des liens physiques. Cela diffère d'un lien souple (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 ou la destination.Sur macOS (avant 10.13 High Sierra)
Si vous avez déjà installé git et Xcode, installez hardlink . C'est un outil microscopique pour créer des liens durs .
Pour créer le lien dur, simplement:
mise à jour macOS High Sierra
Suivez https://github.com/selkhateeb/hardlink/issues/31 pour de futures alternatives.
Sous Linux et autres versions Unix
La
ln
commande peut créer des liens durs:Sous Windows (Vista, 7, 8,…)
Quelqu'un a suggéré d'utiliser mklink pour créer une jonction sous Windows, mais je ne l'ai pas essayé:
la source
ln source destination
fonctionne également sous OS X. Testé sur El Capitan.cp -al source destination
. `-l 'signifie des fichiers de lien dur au lieu de copier.Il s'agit d'un hook de pré-validation qui remplace les objets blob de liens symboliques dans l'index, par le contenu de ces liens symboliques.
Mettez cela
.git/hooks/pre-commit
, et rendez-le exécutable:Remarques
Nous utilisons autant que possible des fonctionnalités conformes à POSIX; cependant,
diff -a
n'est pas compatible POSIX, peut-être entre autres.Il peut y avoir des erreurs / erreurs dans ce code, même s'il a été quelque peu testé.
la source
typechange
dansgit status
les fichiers qui sont en fait des liens symboliques si les choses qu'ils sont maintenant git pas.process_links_to_nondir
?argv[0]
qui est utilisé comme nom de commande pour lesh
processus. (Cela m'a pris un peu de temps pour comprendre cela, car je ne me souvenais pas non plus de ce que c'était ☺😃)find: missing argument to -exec'
. Peut-être qu'une exécution de commande étape par étape est nécessaire au lieu de canaliser et de tout combiner en une seule ligne.typechange
même @DavidFraser, mais le fichier lié ne semble plus être mis en scène)Sur
MacOS
(j'ai Mojave / 10.14,git
version 2.7.1), utilisezbindfs
.brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>
Il a été laissé entendre par d'autres commentaires, mais n'est pas clairement fourni dans d'autres réponses. Espérons que cela fera gagner du temps à quelqu'un.
la source
Failed to resolve
... desNo such file or directory
erreurs à moins que j'utilise des noms de chemin complets avec labindfs
commande.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 vers 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 future version de Git aura un indicateur lui
git-add
permettant de suivre à nouveau les liens symboliques.la source
Je me suis fatigué que chaque solution ici soit obsolète ou nécessitant un root, j'ai donc créé une solution basée sur LD_PRELOAD (Linux uniquement).
Il se connecte aux internes de Git, remplaçant le "est-ce un lien symbolique?" , permettant aux liens symboliques d'être traités comme leur contenu. Par défaut, tous les liens vers l'extérieur du référentiel sont en ligne; voir le lien pour plus de détails.
la source
LD_PRELOAD
pour remplacer les fonctions de la bibliothèque!Avec Git 2.3.2+ (T1 2015), il y a un autre cas où Git ne suivra plus le lien symbolique: voir commit e0d201b par Junio C Hamano (
gitster
) (mainteneur principal de Git)apply
: ne touchez pas un fichier au-delà d'un lien symboliqueCela signifie que, dans ce cas, le message d'erreur ne sera pas générique
"%s: patch does not apply"
, mais plus spécifique:la source
Hmmm,
mount --bind
ne semble pas fonctionner sur Darwin.Quelqu'un at-il une astuce qui le fait?
[édité]
OK, j'ai trouvé que la réponse sur Mac OS X est de 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 ce faire. Voici un lien vers ce programme:Création de liens matériels de répertoire sous Mac OS X
Prendre plaisir!
la source
J'utilise Git 1.5.4.3 et il suit le lien symbolique passé s'il a une barre oblique. Par exemple
la source
fatal: 'src/' is beyond a symbolic link
La conversion à partir de liens symboliques pourrait être utile. Lien dans un dossier Git au lieu d'un lien symbolique par un script .
la source