कड़ी और कड़ी


97

यह देखते हुए कि Git प्रतीकात्मक लिंक को नहीं पहचानता है जो रिपॉजिटरी के बाहर इंगित करता है, क्या हार्ड लिंक का उपयोग करने में कोई समस्या है?

Git उन्हें तोड़ सकता है? क्या आप कृपया मुझे विस्तृत जानकारी दे सकते हैं?


2
आप क्या करने की कोशिश कर रहे हैं और क्यों? एक हार्ड लिंक एक सामान्य फ़ाइल से अलग नहीं है। यदि आप कभी भी एक और रिपॉजिटरी से एक नया संस्करण खींचने के लिए थे, तो यह आपके पास एक को अधिलेखित कर देगा - रेपो के बाहर किसी चीज को जोड़ने का क्या मतलब है?
कार्ल नॉरम

2
Git सहानुभूति को पहचानता है जो रिपॉजिटरी के बाहर एक पथ को इंगित करता है।
मपदी

कोई मिपादी नहीं, एकमात्र तरीका रेपो में फ़ाइलों को लहराता है और उनके "वास्तविक" स्थान में सहानुभूतिपूर्ण लिंक
अल्फ्रेडो पल्हरेस

जवाबों:


88

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

Git उन फ़ाइलों को न छूने की कोशिश करता है जिन्हें इसे अपडेट करने की आवश्यकता नहीं है, लेकिन आपको इस बात का ध्यान रखना होगा कि git हार्डलिंक को संरक्षित करने का प्रयास नहीं करता है, इसलिए उन्हें git द्वारा तोड़ा जा सकता है।


प्रतीकात्मक लिंक के बारे में रिपॉजिटरी के बाहर इंगित करते हैं : git को उनके साथ कोई समस्या नहीं है और उन्हें प्रतीकात्मक लिंक की सामग्री को संरक्षित करना चाहिए ... लेकिन इस तरह के लिंक की उपयोगिता मेरे लिए संदिग्ध है, जैसे कि उन सिम्लिंक को तोड़ा जाएगा या नहीं, गिट रिपॉजिटरी के बाहर फाइलसिस्टम पर निर्भर करता है , और गिट के नियंत्रण में नहीं।


4
रेपो के बाहर के रास्तों के सिम्बलिंक उपयोगी हो सकते हैं। मैंने उन्हें डेटाबेस या मीडिया फ़ाइलों को रेपो द्वारा ट्रैक नहीं करने के लिए इंगित करने के लिए वेबएप्स में उपयोग किया है। इस तरह, वेब ऐप की कॉन्फ़िगरेशन फ़ाइल एक स्थिर पथ को इंगित कर सकती है, लेकिन उस पथ का वास्तविक स्थान स्थानीय विकास और सर्वर वातावरण के बीच भिन्न हो सकता है।
मिपादी

@ मिपाडी: बीटीडब्ल्यू। आधुनिक गीटवेब के पास रिपॉजिटरी के बाहर सामान्यीकरण के बाद सहानुभूति प्रदर्शित करने के लिए विशेष मामला है।
जैकब नारबस्की

6
हां, रेपो के बाहर सहजीवन ठीक है। मैंने उन्हें एक विशाल डेटा निर्देशिका की ओर इशारा किया, जिसकी मुझे आवश्यकता नहीं थी (या चाहते थे) संस्करण। आम तौर पर मैं सापेक्ष लिंक का उपयोग करता हूं। इसलिए रेपो के मामले में और डेटा निर्देशिका को कुछ मूल निर्देशिका में एक दूसरे के बगल में बैठना पड़ता है। आप एक सहकर्मी के साथ अद्भुत चाल कर सकते हैं ../foo।
एड्रियन रत्नापाल

दुर्भाग्य से, Git भंडार के लिए metastore (Git: //git.hardeman.nu/metastore.git) अब उपलब्ध नहीं है।
डेरेक महार

1
github.com/danny0838/git-store-meta git-cache-meta का एक विकल्प है ।
डेरेक महार

22

मुझे पता चला कि, हुक का उपयोग करके, आप git pullईवेंट को कैप्चर कर सकते हैं (जब खींचने के लिए कुछ है ...) स्क्रिप्ट इवेंट हैंडलर को .git/hooks/post-mergeफाइल करने के लिए लिख रहा है ।

सबसे पहले, आपको यह करना chmod +xहोगा।

फिर, lnप्रत्येक पुल पर हार्ड लिंक को फिर से बनाने के लिए इसके अंदर कमांड डालें । नीट हुह!

यह काम करता है, मुझे बस अपनी परियोजना के लिए इसकी आवश्यकता है और ls -iदिखाता है कि फाइलें स्वचालित रूप से लिंक होने के बाद pull


मेरा उदाहरण .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

महत्वपूर्ण: जैसा कि आप देख सकते हैं, आपकी रिपॉजिटरी में किसी भी फ़ाइल का पथ शुरू होना चाहिए $GIT_DIR, फिर फ़ाइल में आंशिक सापेक्ष पथ जोड़ें।

इसके अलावा महत्वपूर्ण: -fआवश्यक है, क्योंकि आप गंतव्य फ़ाइल को फिर से बना रहे हैं।

संपादित करें

आधुनिक git क्लाइंट स्वाभाविक रूप से रिपॉजिटरी के अंदर सहानुभूति और हार्डलिंक का समर्थन करने लगता है, यहां तक ​​कि जब एक दूरस्थ स्थान पर धकेलता है और फिर उससे क्लोनिंग करता है। मैं फिर से एक 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 भी एक महत्वपूर्ण बात बताता है: सहानुभूति को अपेक्षाकृत परिभाषित किया जाना चाहिए।


11
तो ऐसा लगता है कि हर बार जब आप अपने रेपो में एक हार्डलिंक जोड़ते हैं तो आपको मैन्युअल रूप से अपनी पोस्ट-मर्ज हुक स्क्रिप्ट में एक पंक्ति जोड़ने की आवश्यकता होती है। अच्छा होगा यदि आपके पूर्व-प्रतिबद्ध हुक ने इसे पूरी तरह से स्वचालित बना दिया - आपकी प्रतिबद्धता में कड़ी (और प्रतीकात्मक) लिंक का पता लगाना और आपकी पोस्ट-मर्ज फ़ाइल के लिए उपयुक्त लाइनें लिखना। Git को इनो जानकारी को रेपो में संग्रहीत नहीं करना होगा, यह हुक में बिट्स को संग्रहीत करेगा! लेकिन क्या गड़बड़ है अगर लिंक की गई फ़ाइल को किसी अन्य गिट रेपो में ट्रैक किया गया था ... क्या एक जगह पर फ़ाइल को संपादित करना अन्य रेपो को सुचारू रूप से प्रचारित करना होगा? एक परिपत्र धक्का / पुल पाश के साथ सदा विलीन हो जाता है?
hobs

चतुर दृष्टिकोण, लेकिन यह दुर्भाग्यपूर्ण है कि Git हार्ड लिंक को ट्रैक नहीं करता है, यहां तक ​​कि संभावित रूप से फाइल सिस्टम पर प्रतियां के रूप में उनका प्रतिनिधित्व करता है जो हार्ड लिंक का समर्थन नहीं करते हैं।
डेरेक महार

1
@ हॉब्स को जवाब देने में 7 साल लग गए :) आपको सही लगा। यदि रिपॉजिटरी के बाहर की कोई फाइल 2 अलग-अलग रिपोज द्वारा लिंक की गई थी, तो मुझे लगता है कि एक रेपो में लिंक को बदलना सिर्फ दूसरे में नहीं देखा जाएगा।
नीलोक्ट

8

इस msysgit से

जंक्शन बिंदु प्रतीकात्मक लिंक नहीं हैं; इसलिए, प्रतीकात्मक लिंक केवल msysGit में असमर्थित हैं।

इसके अलावा, हार्ड लिंक को कभी भी गिट द्वारा ट्रैक नहीं किया गया था

समस्या विंडोज-उन्मुख थी (चूंकि यह एमएसआईसिट के बारे में है) और सिम्लिंक के संभावित समर्थन के बारे में बहस।
लेकिन कड़ी के बारे में टिप्पणी सामान्य रूप से Git की चिंता करती है।


2

Google 'git हार्ड लिंक्स को संरक्षित करता है' और यह दिखाता है कि git को पता नहीं है कि हार्ड लिंक संरचना AFAIK को कैसे संरक्षित किया जाए, शायद डिजाइन द्वारा।

खान की वेब परियोजनाएँ निम्न लिंक का उपयोग करती हैं:

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*

अगर मैं index.php में परिवर्तन करना चाहता था, तो मैं इसे एक जगह बदल देता हूं और हार्ड लिंक (उत्पाद विवरण पृष्ठ) परिवर्तनों को इंगित करता है - सिवाय इसके कि अन्य कंप्यूटरों पर क्लोनिंग और पुलिंग के दौरान git इस संबंध को संरक्षित नहीं करता है।

me@server:www$ git pull

एक और मशीन पर प्रत्येक कड़ी के लिए एक नया सूचकांक बना।


7
आपको अपने वेब में किसी प्रकार की रूटिंग को लागू करना चाहिए। हार्ड लिंकिंग विचित्र है।
नूकेर

5
हाँ, कम से कम सीमलिंक का उपयोग करें। :)
एंड्रेस रिओप्रियो जूल 26'12

2
यह वास्तव में मैं क्या चाहता हूं, मैं नहीं चाहता कि हार्ड लिंक को संरक्षित किया जाए। मेरे पास कार्यक्षेत्र निर्देशिकाओं के टन के साथ जेनकींस निर्देशिका है, और मल्टीब्रांच पाइपलाइनों के कारण बहुत अधिक दोहराव है। तो मैं एक रात नौकरी रन है कि hardlink --ignore-timeपर /var/lib/jenkins, कुछ डिस्क स्थान को पुनः प्राप्त करने के लिए। दिन के दौरान कुछ फ़ाइलों के बाद git pullया फिर अनहेल्दी हो जाते हैं mvn compile, लेकिन यह ठीक है, मुझे उम्मीद है कि ऐसा होगा। अगर हार्ड लिंक को संरक्षित करना था, तो मेरी डिस्क स्पेस रीसाइक्लिंग रणनीति काम नहीं करेगी।
अमेदी वैन गेससे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.