मैं सिम्टिंक का पालन करने के लिए जीआईटी कैसे प्राप्त कर सकता हूं?


217

क्या मेरा सर्वश्रेष्ठ एक शेल स्क्रिप्ट होने जा रहा है, जो प्रतियों के साथ सहानुभूति की जगह लेता है, या क्या गीट को सिम्मिंक का पालन करने का एक और तरीका है?

पुनश्च: मुझे पता है कि यह बहुत सुरक्षित नहीं है, लेकिन मैं केवल कुछ विशिष्ट मामलों में ही करना चाहता हूं।


5
वहाँ कुछ इस तरह के लिए कड़ी कड़ी का उपयोग करने के लिए एक नुकसान है?
एहतेश चौधरी

12
विंडोज 7 के साथ, "mklink / d" (डायरेक्टरी प्रतीकात्मक लिंक) git के साथ काम नहीं करता है, लेकिन "mklink / j" (juction) ठीक काम करता है।
योयो

1
यदि फ़ाइल को किसी ऐसे एप्लिकेशन द्वारा ऑटोजेनर किया जाता है जो इसे इस तरह से पुन: बनाता है कि यह फाइल को डिलीट करता है और एक नया बनाता है, तो हाँ, यह एक समस्या है हार्डलिंक से लेकर फाइलें हल नहीं होंगी।
मार्टिन पेक्का

1
@EhteshChoudhury आप निर्देशिकाओं के लिए हार्ड लिंक नहीं बना सकते
गौरव कंसल

जवाबों:


46

नोट: यह सलाह अब Git 1.6.1 के बाद से टिप्पणी के अनुसार आउट-डेटेड है। गिट इस तरह से व्यवहार करते थे, और अब नहीं करते हैं।


डिफ़ॉल्ट रूप से उन्हें अनुसरण करने के बजाय (कॉम्पैक्टनेस के लिए, और यह आम तौर पर लोग जो चाहते हैं) के बजाय सिम्लिंक स्टोर करने का प्रयास करते हैं।

हालाँकि, मैं गलती से इसे सिम्लिंक से परे फ़ाइलों को जोड़ने के लिए प्राप्त कर सका जब सीलिंक एक निर्देशिका है।

अर्थात:

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

ऐसा करके

 git add /bar/foo/baz

जब मैंने इसे आजमाया तो यह काम करने लगा। यह व्यवहार उस समय मेरे द्वारा अवांछित था, इसलिए मैं आपको इससे परे की जानकारी नहीं दे सकता।


72
725b06050a083474e240a2436121e0a80bb9f175 और 806d13b1ccdbdde4bbdfb96902791c4b7ed125f6 शुरू की परिवर्तन है कि बंद कर दिया आप सांकेतिक रूप से लिंक निर्देशिका परे फ़ाइलों को जोड़ने के लिए प्रतिबद्ध है, इसलिए इस Git के संस्करणों में नहीं होगा काम के बाद से 1.6.1
मार्क Longair

1
$ git add src / main / path / ConvertSymlinkToDir घातक: 'src / main / path / ConvertSymlinkToDir' एक प्रतीकात्मक लिंक से परे है
user1767316

2
@ user1767316 पूरी बात, और टिप्पणियाँ पढ़ें। यह काम करता था, अब ऐसा नहीं है। सॉफ्टवेयर में परिवर्तन होता है, लेकिन स्टैक-ओवरफ्लो स्वीकार किए गए उत्तर नहीं देते हैं। मैंने स्पष्ट किया है कि यह पहले से काम नहीं करता है। एक और जवाब देखिए।
केंट फ्रेड्रिक

हां @KentFrederic लेकिन सटीक त्रुटि संदेश की पुष्टि करने पर लौटे उपयोगकर्ता को उसकी समस्या के समाधान के लिए स्टैक की मदद करने में मदद मिली। एक ओर आपके उत्तर को सही चेतावनी दी गई है, दूसरी ओर व्यक्ति को अतीत की बजाय अब जवाब देने के लिए प्राथमिकता देनी चाहिए
user1767316

144

Git में एक सिमलिंक के भीतर फ़ाइलों को प्राप्त करने के लिए मैंने क्या जोड़ने के लिए (मैंने सिमलिंक का उपयोग नहीं किया था)

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

इस आदेश को Git- प्रबंधित निर्देशिका में करें। TARGETDIRECTORYइसमें SOURCEDIRECTORYचढ़ने से पहले बनाना पड़ता है।

यह लिनक्स पर ठीक काम करता है, लेकिन ओएस एक्स पर नहीं! उस चाल ने मुझे तोड़फोड़ के साथ भी मदद की। मैं इसे ड्रॉपबॉक्स खाते की फ़ाइलों को शामिल करने के लिए उपयोग करता हूं, जहां एक वेब डिज़ाइनर अपना सामान करता है।


8
अगर सूदो की आवश्यकता नहीं होती तो बहुत अच्छा तरीका होगा।
MestreLion

13
इस बंधन को पूर्ववत करने के लिए, का उपयोग करें umount [mydir]। (+1 आपकी महान टिप के लिए, @ user252400)
JellicleCat

10
यह केवल सत्र के दौरान काम करता है। इसे "शाश्वत" बनाने का सबसे अच्छा तरीका क्या है?
एडोब

17
@ एडोब: इसे / etc / fstab में डालें, जैसे: / sourcedir / targetdir कोई नहीं बाँध
अलेक्जेंडर गार्डन

8
sshfs यहाँ sudo की आवश्यकता के बिना उस तरह की चाल को प्राप्त कर सकते हैं।
PypeBros

75

क्यों नहीं चारों ओर दूसरे तरीके से सहानुभूति पैदा करते हैं? Git रिपॉजिटरी से एप्लिकेशन डायरेक्टरी में लिंक करने के बजाय, बस दूसरे तरीके से लिंक करें।

उदाहरण के लिए, मान लें कि मैं एक ऐसा एप्लिकेशन स्थापित कर रहा हूं ~/applicationजिसमें कॉन्फ़िगरेशन फ़ाइल की आवश्यकता है config.conf:

  • मैं config.confअपने Git रिपॉजिटरी में जोड़ता हूं, उदाहरण के लिए, पर ~/repos/application/config.conf
  • फिर मैं ~/applicationदौड़कर एक सिम्बल बनाता हूं ln -s ~/repos/application/config.conf

यह दृष्टिकोण हमेशा काम नहीं कर सकता है, लेकिन इसने मेरे लिए अब तक अच्छा काम किया है।


5
लगता है एक ही रास्ता है, और यह बुरा नहीं है ... मुझे लगता है कि तुम्हारा एक सुंदर दृष्टिकोण है। git सामग्री ट्रैक करता है, फाइलें नहीं। इसलिए सभी सामग्री को एक साथ रखने और वहाँ से अन्य स्थानों पर सहानुभूति रखने से समझ में आता है
MestreLion

12
मेरे मामले में मुझे एक गिट रेपो से दूसरे में लिंक चाहिए था, इसलिए मैं किसी भी स्थान पर फ़ाइलों को संपादित कर सकता हूं और अपने संबंधित रीमोट्स में वापस कर सकता हूं। विंडोज 7 पर, एक जंक्शन ("mklink / j") ने चाल चली।
योयो

3
बेशक। कभी-कभी इसका उत्तर बस इतना आसान होता है।
विंडोज से पहले BBW

क्या होगा यदि आप स्रोत और गंतव्य दोनों को प्राप्त करना चाहते हैं? (क्योंकि दोनों अलग-अलग कोड के हैं, जिन्हें आप अलग-अलग रिपॉजिटरी में रखना चाहते हैं)
DrGC

1
इस प्रश्न का उत्तर नहीं देता :( मैं चाहता था कि मेरी रिपॉजिटरी का एक हिस्सा मेरे iCloud में सिंक किया जा रहा था। Unfortunatelly, iCloud सिम्बलिंक का पालन नहीं करता है, इसलिए मैंने सोचा कि मैं git को सिम्लिंक का पालन कर सकता हूं, और iCloud में मूल फ़ाइलों को संग्रहीत कर सकता हूं। symlinks: \
जेरी ग्रीन

49

इसके बजाय हार्ड लिंक का उपयोग करें। यह एक नरम (प्रतीकात्मक) लिंक से अलग है। सहित सभी प्रोग्राम, gitफ़ाइल को एक नियमित फ़ाइल के रूप में मानेंगे। ध्यान दें कि सामग्री को बदलने के द्वारा संशोधित किया जा सकता है या तो स्रोत या गंतव्य।

MacOS पर (10.13 उच्च सिएरा से पहले)

यदि आपके पास पहले से गिट और एक्सकोड स्थापित है, तो हार्डलिंक स्थापित करें । यह हार्ड लिंक बनाने के लिए एक सूक्ष्म उपकरण है

सरल लिंक बनाने के लिए, बस:

hln source destination

macOS हाई सिएरा अपडेट

क्या Apple फ़ाइल सिस्टम समर्थन निर्देशिका को कड़ी बनाता है?

निर्देशिका हार्ड लिंक Apple फ़ाइल सिस्टम द्वारा समर्थित नहीं हैं। जब आप HFS + से APOS वॉल्यूम स्वरूपों में macOS पर परिवर्तित होते हैं, तो सभी निर्देशिका हार्ड लिंक को प्रतीकात्मक लिंक या उपनाम में बदल दिया जाता है।

APFS FAQ से developer.apple.com पर

भविष्य के विकल्पों के लिए https://github.com/selkhateeb/hardlink/issues/31 का पालन करें

लिनक्स और अन्य यूनिक्स फ्लेवर्स पर

lnआदेश हार्ड लिंक बना सकते हैं:

ln source destination

विंडोज पर (विस्टा, 7, 8,…)

किसी ने विंडोज पर जंक्शन बनाने के लिए mklink का उपयोग करने का सुझाव दिया , लेकिन मैंने इसकी कोशिश नहीं की है:

mklink /j "source" "destination"

7
बस एक नोट: यह मूल रूप से वही है जो मैं देख रहा था, लेकिन फिर मैंने जाना कि लिनक्स पर, एक हार्डलिंक दुर्भाग्य से फाइलसिस्टम सीमाओं को पार नहीं कर सकता है (जो कि मेरा उपयोग मामला है)।
सादाऊ

26
आप निर्देशिका में हार्डलिंक नहीं कर सकते, क्या आप कर सकते हैं?
नन्ने

1
ln source destinationओएस एक्स में भी काम करता है। एल कैपिटन पर परीक्षण किया गया।
महदी डिबाई

7
@ कोई नहीं, लेकिन आप कर सकते हैं cp -al source destination:। `-l’ का अर्थ है नकल करने के बजाय कड़ी लिंक फाइलें।
पाओलो

6
दुर्भाग्य से आप हार्ड-लिंक निर्देशिका या फ़ाइल सिस्टम सीमाओं के पार नहीं जा सकते। इससे यह समाधान मेरे लिए दुगुना हो जाता है।
कोनराड रुडोल्फ

25

यह एक पूर्व-प्रतिबद्ध हुक है जो अनुक्रमणिका में उन सिम्बलिंक्स की सामग्री के साथ ब्लिंक को प्रतिस्थापित करता है।

इसे डालें .git/hooks/pre-commitऔर इसे निष्पादन योग्य बनाएं:

#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)

# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
    'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

टिप्पणियाँ

हम जितना संभव हो सके POSIX अनुरूप कार्यक्षमता का उपयोग करते हैं; हालाँकि, diff -aसंभवतः POSIX अनुरूप नहीं है, संभवतः अन्य चीजों के बीच।

इस कोड में कुछ गलतियां / त्रुटियां हो सकती हैं, भले ही इसका कुछ परीक्षण किया गया हो।


4
यह वास्तव में फाइलों और निर्देशिकाओं के लिए सवाल का जवाब देने का प्रयास देखने के लिए बहुत अच्छा है। हालांकि, नोट के ऊपर अभी भी दिखेगा कि typechangeमें git statusफ़ाइलों को जो वास्तव में सिमलिंक हैं, हालांकि अब Git बातें वे नहीं हैं के लिए।
डेविड फ्रेजर

1
इसके लिए धन्यवाद; बस जानना चाहता था, क्या है process_links_to_nondir?
सादाऊ

@ सादाऊ यह वह नाम है / argv[0]जो shप्रक्रिया के लिए कमांड-नाम के रूप में प्रयोग किया जाता है। (मुझे यह पता लगाने के लिए थोड़ा सा समझ लिया, क्योंकि मुझे याद नहीं था कि यह या तो bit था)
अब्बैफेई

3
@Abbafei क्या आप उबंटू पर काम करने के लिए स्क्रिप्ट को संशोधित कर सकते हैं (14.04)? यह दिखा रहा है find: missing argument to -exec'। हो सकता है कि पाइप लाइन और सिंगल लाइन में सब कुछ मिलाने के बजाय स्टेप बाई स्टेप कमांड का निष्पादन आवश्यक हो।
खुर्शीद आलम

1
@ कुर्शीदलाम मेरे लिए इसने कमांड लाइनों के बीच में टिप्पणी की गई लाइनों को हटाने का काम किया। हालाँकि, हुक अपेक्षा के अनुरूप काम नहीं करता है (मुझे typechange@DavidFraser जैसा मिलता है, लेकिन लिंक की गई फ़ाइल का अब मंचन नहीं होता है)
Scz

14

पर MacOS(मेरे पास Mojave / 10.14, gitसंस्करण 2.7.1), उपयोग है bindfs

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>

यह अन्य टिप्पणियों द्वारा संकेत दिया गया है, लेकिन अन्य उत्तरों में स्पष्ट रूप से प्रदान नहीं किया गया है। उम्मीद है कि यह किसी को कुछ समय बचाता है।


उन सभी टीमों के लिए बहुत अच्छा लगता है जो सभी मैक ओएस पर चलती हैं, मुझे लगता है कि नीचे दी गई हार्ड लिंक्स को विंडोज़ और लिनक्स के लिए काम करना चाहिए।
डेविन जी रोड

यह मददगार था, और मुझे लगता है कि MacOS में उपयोगी-लेकिन-लापता क्षमता के लिए सबसे अच्छा समाधान है। ध्यान दें कि मुझे मिल रहा था Failed to resolve... No such file or directoryत्रुटियाँ जब तक कि मैंने कमांड के साथ पूर्ण पथ नामों का उपयोग नहीं किया bindfs
इलेक्ट्रोमैगोट

धन्यवाद @electromaggot। जोड़ा गया स्पष्टीकरण कि पूर्ण पथ आवश्यक है
इज़ोसेफ

1
मैकोस कैटालिना पर बढ़िया काम करता है!
जेरी ग्रीन

13

मैं पिछले कुछ समय से सिम्लिंक से परे फाइलें जोड़ता था। यह कोई विशेष व्यवस्था किए बिना, ठीक काम करता था। चूंकि मैंने Git 1.6.1 में अपडेट किया है, इसलिए यह अधिक काम नहीं करता है।

आप इस काम को करने के लिए Git 1.6.0 पर स्विच करने में सक्षम हो सकते हैं। मुझे उम्मीद है कि Git के एक भविष्य के संस्करण में एक ध्वज होगा, git-addजिससे इसे फिर से सहानुभूति का पालन करने की अनुमति मिलेगी।


12

मैं यहाँ पुराना या आवश्यक होने के कारण हर समाधान से थक गया, इसलिए मैंने LD_PRELOAD- आधारित समाधान (Linux) बनाया।

यह 'यह एक सहानुभूति है? फ़ंक्शन, सहकर्मियों को उनकी सामग्री के रूप में व्यवहार करने की अनुमति देता है। डिफ़ॉल्ट रूप से, रेपो के बाहर के सभी लिंक इनबिल्ड होते हैं; विवरण के लिए लिंक देखें।


LD_PRELOADपुस्तकालय कार्यों को ओवरराइड करने के लिए बहुत रचनात्मक समाधान !
iBug

हाँ, लेकिन यह यहाँ विस्तृत होना चाहिए। क्या आप यह कर सकते हैं?
पीटर मोर्टेनसेन

यकीन नहीं है कि कितना विस्तार मदद करेगा; जब तक मैं पूरे स्रोत कोड को कॉपीपेस्ट नहीं करता, यह उत्तर हमेशा उस लिंक पर निर्भर करेगा, जहां एक रीडमी भी पाया जा सकता है। लेकिन हां, मुझे लगता है कि मैं रीडमी के महत्वपूर्ण हिस्सों को पुन: पेश कर सकता हूं।
Alcaro

यह OS X (Mojave 10.14.2) पर संकलन नहीं करता है। 'Strchrnul' के बारे में शिकायत करने वाली चार त्रुटियां प्राप्त करें (क्या आपका मतलब 'strchr'?) और '__xstat64' के बारे में है (क्या आपका मतलब '__lxstat64'?) है। अंत में मुझे "अधूरा प्रकार 'dirent64'" त्रुटि में एक सदस्य का उपयोग मिलता है। इस बात की परवाह किए बिना कि मैं "मेक", "ओपीटी = 1" या "श इंस्टाल" का उपयोग करता हूं।
एरिक वैलैंड

@ErikVeland मैंने थोड़ी कोशिश की, लेकिन ऐसा लगता है जैसे OSX LD_PRELOAD का समर्थन नहीं करता है, न ही कुछ समान। विभिन्न डॉक्स विभिन्न चीजों का सुझाव देते हैं, लेकिन वे सभी कई साल पुराने हैं, और ऐप्पल को अपग्रेडिंग सामान पसंद है; मैं उनमें से कोई भी काम नहीं कर सका। माफ़ करना।
Alcaro

6

Git 2.3.2+ (Q1 2015) के साथ, एक और मामला है जहां Git अब सिम्लिंक का पालन नहीं करेगा : जूनियो C Hamano ( gitster) (मुख्य Git अनुचर) द्वारा प्रतिबद्ध e0d201b देखें

apply: एक प्रतीकात्मक लिंक से परे एक फ़ाइल को स्पर्श न करें

क्योंकि Git प्रतीकात्मक लिंक को प्रतीकात्मक लिंक के रूप में ट्रैक करता है, एक पथ जिसके प्रमुख भाग में एक प्रतीकात्मक लिंक है (जैसे path/to/dir/file, जहांpath/to/dir कहीं और एक प्रतीकात्मक लिंक है, यह काम करने वाले पेड़ के अंदर या बाहर हो) एक पैच में कभी भी प्रकट नहीं हो सकता है जो वैध रूप से लागू होता है , जब तक कि एक ही पैच पहले एक निर्देशिका बनाने के लिए प्रतीकात्मक लिंक को हटा न दे।

ऐसे पैच का पता लगाएँ और अस्वीकार करें।

इसी तरह, जब कोई इनपुट एक प्रतीकात्मक लिंक path/to/dirबनाता है और फिर एक फाइल बनाता है path/to/dir/file, तो हमें path/to/dirफाइल सिस्टम में वास्तव में प्रतीकात्मक लिंक बनाए बिना इसे एक त्रुटि के रूप में चिह्नित करना होगा ।

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

इस तरह, हम:

  • एक शरारत या एक प्रतीकात्मक लिंक path/to/dirऔर एक path/to/dir/fileही समय में एक फ़ाइल जोड़ने के लिए एक गलती को पकड़ने ,
  • एक वैध पैच की अनुमति देते समय जो एक प्रतीकात्मक को हटाता है link path/to/dirऔर फिर एक फ़ाइल जोड़ता है path/to/dir/file

इसका मतलब है कि, उस स्थिति में, त्रुटि संदेश सामान्य जैसा नहीं होगा "%s: patch does not apply", लेकिन अधिक विशिष्ट एक:

affected file '%s' is beyond a symbolic link

4

हम्म, mount --bindडार्विन पर काम नहीं करता है।

क्या किसी के पास कोई चाल है?

[संपादित]

ठीक है, मुझे मैक ओएस एक्स पर एक हार्डलिंक बनाने का उत्तर मिला। सिवाय इसके कि एपीआई के माध्यम से उजागर नहीं किया जाता है ln, इसलिए आपको ऐसा करने के लिए अपने छोटे कार्यक्रम का उपयोग करना होगा। यहाँ उस कार्यक्रम का लिंक दिया गया है:

Mac OS X में डायरेक्टरी हार्ड लिंक बनाना

का आनंद लें!


1
यदि इस हार्डलिंक का गंतव्य निर्देशिका किसी अन्य गिट रेपो का उपनिर्देशिका है, तो यह एक अराजकता होगी। हार्डलिंक में git संचालन करना इस अन्य git रेपो पर लागू होगा। आप जो कर रहे हैं, बस उसे दोबारा जांचें।
युवती

4
यह ऐसा करना संभव है जो code.google.com/p/bindfs के माध्यम से किया जाता है जिसे पोर्ट का उपयोग करके इंस्टॉल किया जा सकता है।
किट सुंडे

0

मैं Git 1.5.4.3 का उपयोग कर रहा हूं और यदि यह एक अनुगामी स्लैश है तो यह पास किए गए सिम्लिंक का अनुसरण कर रहा है। उदाहरण के लिए

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/

5
कम से कम OSX पर यह परिणाम हैfatal: 'src/' is beyond a symbolic link
Dan Rosenstark

2
जैसा कि @Mark Longair द्वारा समझाया गया है, यह केवल git 1.6.1 तक काम किया है
MestreLion

यह मेरा मुद्दा था, धन्यवाद!
माइक क्यू

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