2010-11-09 16 views
14

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

उत्तर

22

आप

git cat-file -e <remote>:<filename> 

उपयोग कर सकते हैं जो कि फाइल मौजूद होने पर शून्य से बाहर निकलें। <remote> के बजाय आप एक दूरस्थ शाखा नाम का उपयोग करेंगे (लेकिन वास्तव में यह कोई पेड़-ईश ऑब्जेक्ट संदर्भ हो सकता है)। ऐसी दूरस्थ शाखा का उपयोग करने के लिए, आपको रिमोट रिपोजिटरी कॉन्फ़िगर और प्राप्त करने की आवश्यकता होगी (यानी git remote add + git fetch का उपयोग करके)।

एक ठोस उदाहरण:

$ git cat-file -e origin/master:README && echo README exists 
README exists 

$ git cat-file -e origin/master:FAILME 
fatal: Not a valid object name origin/master:FAILME 

दो बातें ध्यान रखें:

  • उपयोग / फ़ाइल नाम में पथ परिसीमक के रूप में, यहां तक ​​कि पर उदा विंडोज।
  • <filename> भंडार की जड़ के सापेक्ष एक पूर्ण पथ (जैसे foo/bar/README) है।
+1

'तक ' आप एक मतलब रिमोट शाखा, जिसका अर्थ है कि आपको कॉन्फ़िगर करना होगा रिमोट और रन 'गिट fetch ' पहले; आप अपने रेपो में रिमोट शाखा की जांच कर रहे हैं, इसलिए आपको यह सुनिश्चित करना होगा कि यह अद्यतित है। – Cascabel

+0

निश्चित रूप से, धन्यवाद। मैंने जवाब में इसे शामिल किया। – earl

6

आप भंडार के किसी अन्य भाग डाउनलोड किए बिना अलग-अलग फ़ाइलों का उपयोग करने की git archive उपयोग कर सकते हैं:

if git archive --format=tar \ 
       --remote=<remote_name-or-URL> master README >/dev/null; then 
    echo 'master has README' 
else 
    echo 'master does not have README (or other error)' 
fi 

संग्रह सेवा (upload-archive) सभी सर्वरों या खजाने पर हालांकि सक्षम नहीं किया जा सकता है, आप होगा उन सर्वरों और रिपॉजिटरीज के लिए परीक्षण करने के लिए जिन्हें आपको एक्सेस करने की आवश्यकता है।

यदि संग्रह सेवा उपलब्ध नहीं है, तो आपको वस्तुओं को सामान्य माध्यमों से प्राप्त करना होगा।

यदि आपके पास पहले से ही भंडार के लिए रिमोट सेटअप नहीं है, तो आप FETCH_HEAD में "उथला" लाने के लिए कर सकते हैं (इसे गिट भंडार में किया जाना चाहिए, लेकिन यह पूरी तरह से असंबंधित या खाली भी हो सकता है):

git fetch --depth=1 remote_name-or-URL master 
if git rev-parse --verify --quiet FETCH_HEAD:README >/dev/null; then 
    echo "repository's master has README" 
else 
    echo "repository's master does not have README" 
fi 

आप किसी दूरस्थ भंडार के लिए परिभाषित किया है, तो आप शायद सिर्फ इसे अद्यतन और सामान्य रिमोट ट्रैकिंग शाखाओं के माध्यम से फ़ाइल का उपयोग करना चाहते हैं:

git fetch remote_name 
if git rev-parse --verify --quiet remote_name/master:README >/dev/null; then 
    echo "remote's master has README" 
else 
    echo "remote's master does not have README" 
fi 
+0

ग्रेट सामान! वास्तव में उपयोगी –

+1

चेतावनी दी जानी चाहिए: 'गिट-आर्काइव' समाधान भरोसेमंद काम नहीं करता है। ऐसा लगता है कि केवल शीर्ष स्तर की फ़ाइलों/निर्देशिकाओं के अस्तित्व के लिए जांचें, उदाहरण के लिए: 'git archive --remote = मास्टर डीआईआर-वह-मौजूद/फिर/कुछ/बकवास/पथ' 0 से बाहर निकल जाएगा –

संबंधित मुद्दे

 संबंधित मुद्दे