यह देखते हुए कि Git प्रतीकात्मक लिंक को नहीं पहचानता है जो रिपॉजिटरी के बाहर इंगित करता है, क्या हार्ड लिंक का उपयोग करने में कोई समस्या है?
Git उन्हें तोड़ सकता है? क्या आप कृपया मुझे विस्तृत जानकारी दे सकते हैं?
यह देखते हुए कि Git प्रतीकात्मक लिंक को नहीं पहचानता है जो रिपॉजिटरी के बाहर इंगित करता है, क्या हार्ड लिंक का उपयोग करने में कोई समस्या है?
Git उन्हें तोड़ सकता है? क्या आप कृपया मुझे विस्तृत जानकारी दे सकते हैं?
जवाबों:
'ट्री' ऑब्जेक्ट, Git में निर्देशिकाओं का प्रतिनिधित्व करता है, फ़ाइल नाम और (सब्मिट) अनुमतियाँ संग्रहीत करता है। यह इनकोड संख्या (या फ़ाइल आईडी के अन्य प्रकार) को संग्रहीत नहीं करता है। इसलिए हार्ड लिंक को गिट में प्रतिनिधित्व नहीं किया जा सकता है , कम से कम तीसरे पक्ष के उपकरण जैसे कि मेटास्टोर या गिट-कैश-मेटा (और मुझे यकीन नहीं है कि यह उन उपकरणों के साथ भी संभव है)।
Git उन फ़ाइलों को न छूने की कोशिश करता है जिन्हें इसे अपडेट करने की आवश्यकता नहीं है, लेकिन आपको इस बात का ध्यान रखना होगा कि git हार्डलिंक को संरक्षित करने का प्रयास नहीं करता है, इसलिए उन्हें git द्वारा तोड़ा जा सकता है।
प्रतीकात्मक लिंक के बारे में रिपॉजिटरी के बाहर इंगित करते हैं : git को उनके साथ कोई समस्या नहीं है और उन्हें प्रतीकात्मक लिंक की सामग्री को संरक्षित करना चाहिए ... लेकिन इस तरह के लिंक की उपयोगिता मेरे लिए संदिग्ध है, जैसे कि उन सिम्लिंक को तोड़ा जाएगा या नहीं, गिट रिपॉजिटरी के बाहर फाइलसिस्टम पर निर्भर करता है , और गिट के नियंत्रण में नहीं।
मुझे पता चला कि, हुक का उपयोग करके, आप 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 भी एक महत्वपूर्ण बात बताता है: सहानुभूति को अपेक्षाकृत परिभाषित किया जाना चाहिए।
इस msysgit से
जंक्शन बिंदु प्रतीकात्मक लिंक नहीं हैं; इसलिए, प्रतीकात्मक लिंक केवल msysGit में असमर्थित हैं।
इसके अलावा, हार्ड लिंक को कभी भी गिट द्वारा ट्रैक नहीं किया गया था ।
समस्या विंडोज-उन्मुख थी (चूंकि यह एमएसआईसिट के बारे में है) और सिम्लिंक के संभावित समर्थन के बारे में बहस।
लेकिन कड़ी के बारे में टिप्पणी सामान्य रूप से Git की चिंता करती है।
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
एक और मशीन पर प्रत्येक कड़ी के लिए एक नया सूचकांक बना।
hardlink --ignore-time
पर /var/lib/jenkins
, कुछ डिस्क स्थान को पुनः प्राप्त करने के लिए। दिन के दौरान कुछ फ़ाइलों के बाद git pull
या फिर अनहेल्दी हो जाते हैं mvn compile
, लेकिन यह ठीक है, मुझे उम्मीद है कि ऐसा होगा। अगर हार्ड लिंक को संरक्षित करना था, तो मेरी डिस्क स्पेस रीसाइक्लिंग रणनीति काम नहीं करेगी।