Как git се справя със символични връзки?

Ако имам файл или директория, която е символична връзка и я поставям в хранилището на Git, какво се случва с него?

Бих предложил да го остави като символична връзка, докато файлът бъде изтрит, а след това, ако извлечете файла от старата версия, той просто създава нормален файл.

Какво прави, когато изтрия файла, който препраща? Само фиксира линията за окачване?

1369
05 июня '09 в 9:53 2009-06-05 09:53 Алекс е настроен на 05.06.09 в 9:53 2009-06-05 09:53
@ 3 отговора

Git просто съхранява съдържанието на връзката (т.е. Пътя към обекта на файловата система, за който се отнася) в "blob", както се прави за обикновен файл. След това съхранява името, режима и типа (включително факта, че е символична връзка) в обекта на дървото, който представлява съдържащата го директория.

Когато извличате дърво, съдържащо връзка, то възстановява обекта като символна връзка, независимо от това дали обектът на целевата файлова система съществува или не.

Ако изтриете файл, който е посочен от символна връзка, той няма да повлияе на символната връзка, управлявана от Git. Ще имате връзка за окачване. Потребителят може да изтрие или модифицира връзката, за да укаже, че нещо е валидно, ако е необходимо.

1146
05 июня '09 в 10:01 2009-06-05 10:01 отговорът е даден от CB Bailey Юни 05 '09 в 10:01 2009-06-05 10:01

TL; DR: Данните, цитирани от символната връзка, не се съхраняват в хранилището.


Можете да разберете какво прави Git към даден файл, като видите какво прави, когато го добавите към индекса. Индексът е подобен на префикса. След като фиксирате индекса, можете да използвате git checkout да върнете всичко, което е било в индекса, обратно в работната директория. И така, какво прави Git, когато добавите символична връзка към индекса?

За да разберете, първо направете символична връзка:

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

Git все още не знае за този файл. git ls-files ви позволява да проверите индекса ( -s stat like):

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

Сега добавете съдържанието на символната връзка към хранилището на обекти Git, като го добавите към индекса. Когато добавите файл към индекса, Git запазва съдържанието си в хранилището на Git обект.

 $ git add ./symlink 
border=0

И така, какво е добавено?

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

Хешът е връзка към пакетиран обект, създаден в хранилището на обекти Git. Можете да проверите този обект, като прегледате .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c в корена на хранилището. Този файл е това, което съхранява Git и какво можете да извлечете от хранилището си, когато добавяте и поемате символична връзка. Ако прегледате този файл, ще видите, че той е много малък. Той не съхранява съдържанието на съответния файл.

(Забележете, че 120000 е файловия режим, посочен в изхода на ls-files . Той ще бъде нещо като 100644 за обикновен файл.)

Но какво прави Git с този обект, когато го извличате от хранилището и в неговата файлова система? Това зависи от конфигурацията на core.symlinks . От man git-config :

core.symlinks

Ако неверни, символни връзки се извличат под формата на малки прости файлове, които съдържат текста на връзката.

По този начин, имайки символична връзка в хранилището, при извличане получавате или текстов файл с връзка към пълния път към файловата система, или правилната символна връзка, в зависимост от стойността на конфигурацията core.symlinks .

Във всеки случай данните, цитирани от символната връзка, не се съхраняват в хранилището.

172
13 сент. Отговор, даден от Дмитрий Минковски 13 септември 2013-09-13 20:06 '13 в 20:06 2013-09-13 20:06

Забележка на редактора: тази публикация може да съдържа остаряла информация. Моля, вижте коментарите и този въпрос относно промените в Git от 1.6.1.

Символични директории:

Важно е да се отбележи какво се случва, когато има директория, която е мека връзка. Всяка Git pull update актуализира връзката и я прави нормална директория. Това научих по трудния начин. Някои идеи тук и тук.

пример

До

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

git add/commit/push

 It remains the same 

След git pull и някои намерени актуализации

  drwxrwsr-x 2 admin adm 4096 Oct 2 05:54 src/somedir 
143
02 окт. отговорът е даден Shekhar 02 oct. 2009-10-02 09:16 '09 в 9:16 ч. 2009-10-02 09:16

Други въпроси относно маркерите или Задайте въпрос