Git प्रतीकात्मक लिंक कैसे संभालता है?


1607

अगर मेरे पास एक फ़ाइल या निर्देशिका है जो एक प्रतीकात्मक लिंक है और मैं इसे Git रिपॉजिटरी के लिए प्रतिबद्ध करता हूं, तो इसका क्या होता है?

मुझे लगता है कि यह फ़ाइल को हटाए जाने तक एक प्रतीकात्मक लिंक के रूप में छोड़ देता है और फिर यदि आप फ़ाइल को पुराने संस्करण से वापस खींचते हैं तो यह एक सामान्य फ़ाइल बनाता है।

जब मैं यह संदर्भ फ़ाइल हटाता हूं तो यह क्या करता है? क्या यह सिर्फ झूलने की कड़ी है?


19
.gitignoreसिम्लिंक को एक फाइल के रूप में देखता है एक फ़ोल्डर नहीं।
0xcaff

6
खैर, जाहिर है कि इस सवाल का मतलब है कि उत्तर से अधिक है। उदाहरण के लिए, मैं निम्नलिखित पर विचार कर रहा हूं: यदि मैं अपनी रिपॉजिटरी में उस रिपॉजिटरी में किसी बड़ी फाइल में एक सिम्पल लिंक बनाता हूं, तो बदलावों को आगे बढ़ाएं, और फिर उन बदलावों को दूसरी मशीन में खींचें, क्या होगा? क्या बड़ी फ़ाइल को दोनों स्थानों में एक बड़ी फ़ाइल के रूप में संग्रहीत किया जाएगा, या क्या सिम्बल लिंक को संरक्षित किया जाएगा, जैसे कि नई मशीन पर, लिंक फ़ाइल मूल बड़ी फ़ाइल की ओर इशारा करती है?
jvriesem

7
यह एक पुराना धागा है लेकिन यह टिप्पणी अभी भी उपयोगी हो सकती है। Jviesem के जवाब में, एक नरम लिंक मूल रूप से एक फ़ाइल है जिसमें दूसरी फ़ाइल का नाम है। इसलिए एक बार जब आप इसे एक अलग मशीन पर खींचते हैं, तो लिंक डाउनलोड हो जाएगा और इसमें मूल फ़ाइल सिस्टम पर बड़ी फ़ाइल का नाम होगा। यदि नई मशीन पर नाम मान्य नहीं है, तो फिर लिंक में एक अमान्य नाम होगा। बड़ी फाइल को नई मशीन में डाउनलोड नहीं किया जाएगा।
लसारो

6
@ जेलारो, गिट रेपो में टूटे हुए लिंक से बचने का तरीका यह है कि जब भी जरूरत हो, सिम्बलिंक्स बनाते समय सापेक्ष रास्तों का उपयोग ../..किया जाए।
वाइल्डकार्ड

8
ध्यान दें कि विंडोज के अधिकांश संस्करणों में आपको सिमलिंक बनाने के लिए उन्नत अनुमतियों की आवश्यकता होती है। यदि आप Windows पर हैं और git pullसिम्लिंक के बजाय एक फ़ाइल बनाते हैं, तो आपको व्यवस्थापक के रूप में Git क्लाइंट चलाने का प्रयास करें।
axmrnv

जवाबों:


1348

Git बस लिंक की सामग्री को संग्रहीत करता है (यानी फ़ाइल सिस्टम ऑब्जेक्ट का पथ जो इसे लिंक करता है) एक 'ब्लॉब' में उसी तरह से होता है जैसे वह एक सामान्य फ़ाइल के लिए होता है। यह तब ट्री ऑब्जेक्ट में नाम, मोड और प्रकार (इस तथ्य को शामिल करता है कि यह एक सिमलिंक है) को संग्रहीत करता है जो इसकी युक्त निर्देशिका का प्रतिनिधित्व करता है।

जब आप लिंक वाले किसी पेड़ की जांच करते हैं, तो यह लक्ष्य सिम्बल के रूप में ऑब्जेक्ट को पुनर्स्थापित करता है, भले ही लक्ष्य फ़ाइल सिस्टम ऑब्जेक्ट मौजूद हो या नहीं।

यदि आप उस फ़ाइल को हटाते हैं जिसे सिम्लिंक संदर्भित करता है तो यह किसी भी तरह से गिट-नियंत्रित सिम्कल को प्रभावित नहीं करता है। आपके पास झूलने वाला संदर्भ होगा। यह उपयोगकर्ता पर निर्भर है कि यदि आवश्यक हो, तो किसी मान्य चीज़ को इंगित करने के लिए लिंक को हटा दें या बदल दें।


328
Btw। यदि आप FAT की तरह फाइल सिस्टम पर हैं, जो प्रतीकात्मक लिंक का समर्थन नहीं करता है, और आपका रिपॉजिटरी उनका उपयोग करता है, तो आप core.symlinksकॉन्फ़िगरेशन चर को गलत पर सेट कर सकते हैं , और लिंक टेक्स्ट में समतल पाठ फ़ाइलों के रूप में सिमिलिंक की जाँच की जाएगी।
जकुब नारबस्की

14
@ JakubNar Jakbski मैंने इससे पहले देखा था। हमारे रेपो में एक लाइन के साथ एक टेक्स्ट फाइल थी, एक लाइब्रेरी का एक रास्ता जिसका हम उपयोग करते हैं। यह पता नहीं लगा सका कि इसका उद्देश्य क्या था। मुझे पता है कि अब क्या हुआ।
मैट के

25
मैं अत्यधिक उत्कीर्ण उत्तर पर टिप्पणी करने में संकोच करता हूं, लेकिन मुझे लगता है कि "सामान्य फाइल के लिए यह ठीक वैसे ही होगा जैसे" नए लोगों को गुमराह करने वाला हो सकता है।
मैथ्यू हैनिगन

10
(संपादित समय से बाहर भाग गया) यह केवल एक सामान्य फ़ाइल की तरह है जिसमें सामग्री एक बूँद में है। महत्वपूर्ण अंतर यह है कि एक सामान्य फ़ाइल के लिए बूँद फ़ाइल सामग्री है, लेकिन सिम्बलिन के लिए बूँद में उस फ़ाइल का पथनाम होता है जिससे वह लिंक करता है। @ JakubNar Jakbski "छोटे सादे पाठ फ़ाइलों" के बारे में .. आप आशा करेंगे कि वे छोटे और पाठ हैं, लेकिन निश्चित रूप से एक बूँद एक बूँद है और संभवतः विशाल और द्विआधारी हो सकती है। जब एक फ़ाइल को सिम्लिंक के रूप में गलत किया जाता है, तो stackoverflow.com/questions/18411200/… देखें ।
मैथ्यू हैनिगन

2
सीमलिंक के लिए अपनी वैश्विक सेटिंग्स और सिमिलिंक के लिए स्थानीय सेटिंग्स की जांच करना सुनिश्चित करें। यदि सेटिंग्स को टॉरटिसगिट या खिड़कियों से कॉपी किया गया था, तो आप symlinks = falseउनके साथ गड़बड़ कर सकते थे।
फिएट

250

आप यह जान सकते हैं कि एक फ़ाइल के साथ Git क्या करता है यह देखकर कि यह क्या करता है जब आप इसे सूचकांक में जोड़ते हैं। सूचकांक पूर्व की तरह है। सूचकांक के साथ, आप उपयोग कर सकते हैंgit checkout चीजों को लाने के लिए जो इंडेक्स में वापस काम कर रहे डायरेक्टरी में थे। जब आप सूचकांक में एक प्रतीकात्मक लिंक जोड़ते हैं, तो Git क्या करता है?

यह जानने के लिए, पहले, एक प्रतीकात्मक लिंक बनाएं:

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

Git को अभी तक इस फ़ाइल के बारे में पता नहीं है। git ls-filesआपको अपने सूचकांक ( -sप्रिंट्स stat-जैसे आउटपुट) का निरीक्षण करने देता है :

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

अब, इंडिक लिंक की सामग्री को अनुक्रमणिका में जोड़कर Git ऑब्जेक्ट स्टोर में जोड़ें। जब आप अनुक्रमणिका में एक फ़ाइल जोड़ते हैं, तो Git अपनी सामग्री को Git ऑब्जेक्ट स्टोर में संग्रहीत करता है।

$ git add ./symlink

तो, क्या जोड़ा गया था?

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

हैश पैक्ड ऑब्जेक्ट का एक संदर्भ है जो गिट ऑब्जेक्ट स्टोर में बनाया गया था। यदि आप .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15cअपने भंडार के मूल में देखते हैं तो आप इस वस्तु की जांच कर सकते हैं । यह वह फाइल है जिसे Git भंडार में संग्रहीत करता है, जिसे आप बाद में देख सकते हैं। यदि आप इस फ़ाइल की जांच करते हैं, तो आप देखेंगे कि यह बहुत छोटा है। यह लिंक की गई फ़ाइल की सामग्री को संग्रहीत नहीं करता है।

(नोट आउटपुट 120000में सूचीबद्ध मोड है ls-files। यह 100644एक नियमित फ़ाइल के लिए कुछ ऐसा होगा ।)

लेकिन जब आप इसे भंडार से और अपने फाइल सिस्टम में जांचते हैं तो इस वस्तु के साथ Git क्या करता है? यह core.symlinksविन्यास पर निर्भर करता है । से man git-config:

core.symlinks

यदि गलत है, तो प्रतीकात्मक लिंक को छोटे सादे फाइलों के रूप में जांचा जाता है, जिसमें लिंक टेक्स्ट होता है।

इसलिए, रिपॉजिटरी में एक प्रतीकात्मक लिंक के साथ, चेकआउट पर आपको या तो पूर्ण फाइल सिस्टम पथ के संदर्भ में एक पाठ फ़ाइल मिलती है, या core.symlinksकॉन्फ़िगरेशन के मूल्य के आधार पर एक उचित प्रतीकात्मक लिंक ।

किसी भी तरह से, सिम्लिंक द्वारा संदर्भित डेटा भंडार में संग्रहीत नहीं किया जाता है।


1
बहुत बढ़िया जवाब
CervEd

147

"संपादक के नोट": इस पोस्ट में पुरानी जानकारी हो सकती है। कृपया 1.6.1 के बाद से Git में बदलाव के बारे में टिप्पणियां और इस सवाल को देखें ।

सहिष्णु निर्देशिका:

यह नोट करना महत्वपूर्ण है कि क्या होता है जब एक निर्देशिका होती है जो एक नरम लिंक होती है। अपडेट के साथ कोई भी गिट पुल लिंक को हटा देता है और इसे एक सामान्य निर्देशिका बनाता है। यही मैंने कठिन तरीके से सीखा है। कुछ अंतर्दृष्टि यहाँ और यहाँ।

उदाहरण

इससे पहले

 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

4
यह ध्यान देने योग्य है कि सिम्प्लाइड डाइरेक्टरीज़ के बारे में ये चेतावनियाँ, सिम्डलिंक के वर्जन पर लागू नहीं होती हैं। विचाराधीन प्रमुख मामला यह था कि लोगों ने कुछ या सभी काम करने वाले पेड़ों को एक अलग पथ में (अधिक डिस्क स्थान के साथ एक अलग विभाजन पर कहें) और मौजूदा सिमिंक के माध्यम से कोड की जांच करने की उम्मीद कर रहे थे। यही है, अगर आपके पास एक ऐसी परियोजना है जिसमें फ़ाइलों या निर्देशिकाओं के लिए संस्करणबद्ध सम्लिंक्स शामिल हैं, तो सामान्य सीमलिंक-ए-ब्लॉब व्यवहार, सिम्लिंक्स को संरक्षित करेगा, जो कि सहानुभूति के अनुसार सही रूप से संस्करण परिवर्तन करता है, और अन्यथा अपेक्षित रूप से कार्य करता है।
जॉन व्हिटले

उपरोक्त व्यवहार git 1.6.5.6 के साथ परीक्षण किया गया; लेकिन मुझे दृढ़ता से संदेह है कि संस्करण व्यवहार काफी समय से सही है।
जॉन व्हिटले

22
क्या यह व्यवहार गिट के सभी संस्करणों पर मौजूद है या इसके साथ तय किया गया है?
jbotnik

24
ऐसा लगता है कि यह व्यवहार अब तय हो गया है, देखें: stackoverflow.com/a/1943656/1334781
Ron Wertlen

2
शकर: क्या आप हाल के वर्षों में परिवर्तन में परिवर्तन को प्रतिबिंबित करने के लिए अपना जवाब संपादित करेंगे?
यिनपोकलम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.