GNU/Linux >> Linux Esercitazione >  >> Linux

Git e collegamenti reali

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.


Linux
  1. Come creare collegamenti rigidi e simbolici in Linux

  2. Spiegazione di hard link e soft link in Linux

  3. La differenza tra collegamenti simbolici e hard?

  4. Come creare collegamenti soft e hard in Linux

  5. RHEL 7 – RHCSA Note:crea collegamenti rigidi e soft.

Cos'è Git e come installare Git in Linux

Come installare e utilizzare Git nel sistema Linux

Il comando ln in Linux:crea collegamenti soft e hard

Installazione e primi passi con Git

Hard link e soft link in Linux:tutto ciò che devi sapere

rsync e collegamenti simbolici