Kaip git tvarko simbolines nuorodas?

Jei turiu failą ar katalogą, kuris yra simbolinė nuoroda ir aš ją įdėjau į „Git“ saugyklą, kas atsitiks?

Siūlau, kad ji palieka ją kaip simbolinę nuorodą, kol failas bus ištrintas, o tada ištraukus failą iš senosios versijos, jis tiesiog sukuria įprastą failą.

Ką ji daro, kai ištrinu nuorodą į failą? Ar tai tiesiog išsprendžia kabančią nuorodą?

1369
05 июня '09 в 9:53 2009-06-05 09:53 Alexas yra nustatytas birželio 05'09 09:53 2009-06-05 09:53
@ 3 atsakymai

„Git“ tiesiog saugo nuorodos turinį (t. Y. Kelią į failų sistemos objektą, į kurį jis nurodo) „blob“, kaip tai daroma įprastiniam failui. Tada jis išsaugo pavadinimą, režimą ir tipą (įskaitant faktą, kad tai yra simbolinė nuoroda) medžio objekto, kuriame yra jo turintis katalogas.

Ištraukus medį, kuriame yra nuoroda, jis atkuria objektą kaip simbolinę nuorodą, nepriklausomai nuo to, ar egzistuoja taikinio failų sistemos objektas.

Jei ištrinate failą, kuriam nurodyta simbolinė nuoroda, tai neturės įtakos simbolinei nuorodai, kurią valdo „Git“. Turėsite kabančią nuorodą. Vartotojas gali ištrinti arba modifikuoti nuorodą, kad prireikus būtų nurodyta, kas yra teisinga.

1146
05 июня '09 в 10:01 2009-06-05 10:01 atsakymą pateikė CB Bailey, birželio 05'09, 10:01 2009-06-05 10:01

Tl; DR: Duomenys, nurodyti simboline nuoroda, nėra saugomi saugykloje.


Galite sužinoti, ką „Git“ daro failui, matydamas, ką jis daro, kai pridedate jį prie indekso. Indeksas yra panašus į prefiksą. Nustatę indeksą, galite naudoti git checkout kad grąžintumėte viską, kas buvo rodyklėje, atgal į darbo katalogą. Taigi, ką daro „Git“, kai pridedate simbolinę nuorodą į indeksą?

Norėdami sužinoti, atlikite simbolinę nuorodą:

 $ ln -s /path/referenced/by/symlink symlink 

Git dar nežino apie šį failą. git ls-files leidžia patikrinti savo indeksą ( -s ):

 $ git ls-files -s ./symlink [nothing] 

Dabar pridėkite simbolinės nuorodos turinį į „Git“ objekto saugyklą, pridėdami jį prie indekso. Pridėjus failą prie indekso, „Git“ išsaugo jo turinį į „Git“ objekto saugyklą.

 $ git add ./symlink 
border=0

Taigi, kas buvo pridėta?

 $ git ls-files -s ./symlink 120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink 

„Hash“ yra nuoroda į supakuotą objektą, kuris buvo sukurtas „Git“ objekto saugykloje. Šį objektą galite patikrinti, peržiūrėdami .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c savo saugyklos šaknį. Šis failas yra tai, ką „Git“ saugo ir ką galite išgauti iš savo saugyklos, kai pridedate ir pridedate simbolinę nuorodą. Jei ištirsite šį failą, pamatysite, kad jis yra labai mažas. Jis nesaugo susieto failo turinio.

(Atkreipkite dėmesį, kad 120000 yra failų režimas, nurodytas ls-files išvestyje. Tai bus kažkas panašaus į 100644 jei norite reguliariai 100644 .)

Bet ką Git daro su šiuo objektu, kai jį atkuriate iš saugyklos ir į failų sistemą? Tai priklauso nuo core.symlinks konfigūracijos. Iš man git-config :

core.symlinks

Jei klaidingos, simbolinės nuorodos ištraukiamos mažų paprastų failų, kuriuose yra nuorodos tekstas, forma.

Taigi, turint simbolinę nuorodą saugykloje, kai gaunate, gaunate tekstinį failą su nuoroda į visą failų sistemos kelią arba teisingą simbolinę nuorodą, priklausomai nuo konfigūracijos vertės core.symlinks .

Bet kokiu atveju, simbolinė nuoroda nurodyti duomenys nėra saugomi saugykloje.

172
13 сент. Dmitrio Minkovskio atsakymas rugsėjo 13 d 2013-09-13 20:06 '13, 20:06, 2013-09-13 20:06

Redaktoriaus pastaba: šiame pranešime gali būti pasenusi informacija. Žiūrėkite komentarus ir šį klausimą dėl „Git“ pokyčių nuo 1.6.1.

Simboliniai katalogai:

Svarbu pažymėti, kas atsitinka, kai yra katalogas, kuris yra minkštas ryšys. Bet kuris „Git pull“ atnaujinimas atnaujina nuorodą ir tampa įprastu katalogu. Tai aš išmokau sunkiai. Kai kurios idėjos čia ir čia.

pavyzdys

Iki

  ls -l lrwxrwxrwx 1 admin adm 29 Sep 30 15:28 src/somedir -> /mnt/somedir 

git add/commit/push

 It remains the same 

Po git pull ir kai kurie atnaujinimai rasti

  drwxrwsr-x 2 admin adm 4096 Oct 2 05:54 src/somedir 
143
02 окт. atsakymas duotas Shekhar 02 okt. 2009-10-02 09:16 '09 9:16 am 2009-10-02 09:16

Kiti klausimai apie žymes arba Užduoti klausimą