Ho scoperto che, usando gli hook, puoi catturare il git pull
event (quando c'è qualcosa da estrarre...) scrivendo il gestore di eventi dello script in .git/hooks/post-merge
file.
Innanzitutto, devi chmod +x
esso.
Quindi, inserisci il ln
comandi al suo interno per ricreare i collegamenti fisici a ogni pull. Perfetto eh!
Funziona, ne avevo solo bisogno per il mio progetto e ls -i
mostra che i file sono stati collegati automaticamente dopo pull
.
Il mio esempio di .git/hooks/post-merge
:
#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf
IMPORTANTE:come puoi vedere, il percorso di qualsiasi file nel tuo repository dovrebbe iniziare con $GIT_DIR
, quindi aggiungi il percorso relativo parziale al file.
Altrettanto importante:-f
è necessario perché stai ricreando il file di destinazione.
MODIFICA
Il moderno client git sembra supportare i collegamenti simbolici e gli hardlink all'interno del repository in modo naturale, anche quando si effettua il push in una posizione remota e quindi la clonazione da esso. Non ho mai più avuto la necessità di collegarmi al di fuori di un repository git però...
$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
3 files changed, 3 insertions(+)
create mode 100644 hardlink
create mode 120000 symlink
create mode 100644 x/original
Clonazione dal repository git locale
$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink symlink x
$ cat symlink
123
$ cat hardlink
123
Clonazione da repository remoto
$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
+ 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123
https://github.com/mokacoding/symlinks indica anche una cosa importante:i collegamenti simbolici devono essere definiti relativamente.
L'oggetto 'tree', che rappresenta le directory in Git, memorizza il nome del file e (un sottoinsieme di) autorizzazioni. Non memorizza il numero di inode (o altro tipo di ID file). Pertanto collegamenti reali non può essere rappresentato in git , almeno non senza strumenti di terze parti come metastore o git-cache-meta (e non sono sicuro che sia possibile anche con questi strumenti).
Git cerca di non toccare i file che non ha bisogno di aggiornare, ma devi tener conto del fatto che git non cerca di preservare gli hardlink, quindi possono essere interrotti da git.
Informazioni sui link simbolici che puntano all'esterno del repository :git non ha problemi con loro e dovrebbe preservare i contenuti dei collegamenti simbolici... ma l'utilità di tali collegamenti è dubbia per me, poiché se quei collegamenti simbolici sarebbero interrotti o meno dipende dal layout del filesystem all'esterno git repository e non sotto il controllo di git.
Da questo problema con msysgit
I punti di giunzione non sono collegamenti simbolici; pertanto, i collegamenti simbolici sono semplicemente non supportati in msysGit.
Inoltre, gli hard link non sono mai stati tracciati da Git .
Il problema era orientato a Windows (poiché si tratta di msysgit) e il dibattito sul potenziale supporto del collegamento simbolico.
Ma il commento sull'hard link riguarda Git in generale.