Biorąc pod uwagę, że Git nie rozpoznaje dowiązań symbolicznych, które wskazują poza repozytorium, czy jest jakiś problem z używaniem dowiązań twardych?
Czy Git może je złamać? Czy możesz wskazać mi szczegółowe informacje?
Biorąc pod uwagę, że Git nie rozpoznaje dowiązań symbolicznych, które wskazują poza repozytorium, czy jest jakiś problem z używaniem dowiązań twardych?
Czy Git może je złamać? Czy możesz wskazać mi szczegółowe informacje?
Odpowiedzi:
Obiekt 'tree', reprezentujący katalogi w Git, przechowuje nazwę pliku i (podzbiór) uprawnień. Nie przechowuje numeru i-węzła (ani innego rodzaju identyfikatora pliku). Dlatego twarde linki nie mogą być reprezentowane w git , przynajmniej nie bez narzędzi innych firm, takich jak metastore lub git-cache-meta (i nie jestem pewien, czy jest to możliwe nawet z tymi narzędziami).
Git stara się nie dotykać plików, których nie musi aktualizować, ale musisz wziąć pod uwagę, że git nie próbuje zachować twardych linków, więc mogą zostać zerwane przez git.
O linkach symbolicznych wskazujących poza repozytorium : git nie ma z nimi problemów i powinien zachować zawartość linków symbolicznych ... ale użyteczność takich linków jest dla mnie wątpliwa, ponieważ to, czy te dowiązania symboliczne byłyby zepsute, czy nie, zależy od układu systemu plików poza repozytorium git i nie jest pod kontrolą git.
Dowiedziałem się, że za pomocą hooków można przechwycić git pull
zdarzenie (gdy jest coś do ściągnięcia ...) zapisując obsługę zdarzeń skryptu do .git/hooks/post-merge
pliku.
Po pierwsze, musisz to chmod +x
zrobić.
Następnie umieść w nim ln
polecenia, aby odtworzyć twarde linki przy każdym pociągnięciu. Schludnie huh!
Działa, po prostu potrzebowałem tego do mojego projektu i ls -i
pokazuje, że pliki zostały automatycznie połączone później pull
.
Mój przykład .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
WAŻNE: Jak widzisz, ścieżka do dowolnego pliku w repozytorium powinna zaczynać się od $GIT_DIR
, a następnie dodaj częściową ścieżkę względną do pliku.
Również ważne: -f
jest to konieczne, ponieważ odtwarzasz plik docelowy.
Nowoczesny klient git wydaje się w naturalny sposób obsługiwać dowiązania symboliczne i twarde w repozytorium, nawet podczas wypychania do zdalnej lokalizacji, a następnie klonowania z niej. Nigdy więcej nie musiałem łączyć się poza repozytorium git ...
$ 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
$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink symlink x
$ cat symlink
123
$ cat hardlink
123
$ 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 również wskazuje na ważną rzecz: linki symboliczne muszą być zdefiniowane względnie.
Z tego wydania msysgit
Punkty połączeń nie są dowiązaniami symbolicznymi; dlatego dowiązania symboliczne po prostu nie są obsługiwane w msysGit.
Ponadto twarde linki nigdy nie były śledzone przez Git .
Problem dotyczył systemu Windows (ponieważ dotyczy msysgit) i debatowano nad potencjalnym wsparciem łącza symbolicznego.
Ale komentarz dotyczący twardego łącza dotyczy ogólnie Gita.
Google „git zachowaj twarde linki” i pokazuje, że git nie wie, jak zachować strukturę twardych linków AFAIK, być może zgodnie z projektem.
Moje projekty internetowe używają twardych linków w następujący sposób:
www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)
me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*
Gdybym chciał wprowadzić zmiany w index.php, to zmieniam go w jednym miejscu, a twarde linki (strony ze szczegółami produktów) wskazują zmiany - poza tym, że git nie zachowuje tej relacji podczas klonowania i ściągania na innych komputerach.
me@server:www$ git pull
na innym komputerze utworzy nowy plik index.php dla każdego twardego łącza.
hardlink --ignore-time
na /var/lib/jenkins
odzyskaniu miejsca na dysku. W ciągu dnia niektóre pliki są ponownie odłączane po git pull
lub mvn compile
ale to jest w porządku, spodziewam się, że tak się stanie. Gdyby git miał zachować twarde łącza, moja strategia recyklingu miejsca na dysku nie zadziałałaby.