Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

GitHub और GitLab रिपॉजिटरी को क्लोन और प्रबंधित करने के लिए Bash वन-लाइनर्स में महारत हासिल करें

मुझे एक सुंदर Bash की एक पंक्ति से अधिक संतोषजनक कुछ चीजें हैं जो घंटों के थकाऊ काम को स्वचालित करती है।

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

फिर, अपनी सभी अंडे एक ही टोकरी में न रखने की भावना में, मैंने GitLab-होस्टेड बैकअप को स्वचालित रूप से बनाने और पुश करने के लिए एक और वन-लाइनर लिखा। यहां वे हैं।

अपने सभी GitHub रिपॉजिटरी को क्लोन करने के लिए एक Bash वन-लाइनर

चेतावनी: आपको उन GitHub रिपॉजिटरी की एक सूची की आवश्यकता होगी जिन्हें आप क्लोन करना चाहते हैं। इसके बारे में अच्छी बात यह है कि यह आपको केवल उन रिपॉजिटरी को चुनने के लिए पूर्ण एजेंसी देता है जो आप अपनी मशीन पर चाहते हैं, बजाय पूरे-पूरे जाने के।

आप HTTPS का उपयोग करके अपने 15-मिनट के कैश्ड क्रेडेंशियल्स के साथ या, मेरी पसंदीदा विधि, SSH के साथ GitHub से कनेक्ट करके प्रत्येक बार अपना पासवर्ड दर्ज किए बिना GitHub रिपॉजिटरी को आसानी से क्लोन कर सकते हैं। संक्षिप्तता के लिए मैं मान लूंगा कि हम बाद वाले के साथ जा रहे हैं, और हमारे SSH कुंजियाँ सेट अप हैं।

दिए गए gh-repos.txt फाइल में GitHub URLs की एक सूची, जैसे:

git@github.com:username/first-repository.git
git@github.com:username/second-repository.git
git@github.com:username/third-repository.git

हम चलाते हैं:

xargs -n1 git clone < gh-repos.txt

यह सूची में सभी रिपॉजिटरी को वर्तमान फोल्डर में क्लोन करता है। यह वही वन-लाइनर GitLab के लिए भी काम करता है, यदि आप उपयुक्त URLs को प्रतिस्थापित करते हैं।

यहां क्या हो रहा है?

इस वन-लाइनर के दो हिस्से हैं: इनपुट, प्रतिकूल रूप से दाईं ओर, और वह हिस्सा जो चीजों को होता है, बाईं ओर। हम इन भागों के क्रम को अधिक सहज (शायद?) बना सकते हैं उसी कमांड को इस तरह लिखकर:

< gh-repos.txt xargs -n1 git clone

हमारे इनपुट, gh-repos.txt की प्रत्येक लाइन के लिए कमांड चलाने के लिए, हम xargs -n1 का उपयोग करते हैं। टूल xargs इनपुट से आइटम पढ़ता है और जो भी कमांड यह पाता है उसे निष्पादित करता है (यदि यह कोई नहीं पाता तो यह echo करेगा)। डिफ़ॉल्ट रूप से, यह मानता है कि आइटम स्पेस द्वारा अलग किए गए हैं; नई लाइनें भी काम करती हैं और हमारी सूची को पढ़ना आसान बनाती हैं। फ्लैग -n1 xargs को प्रति कमांड 1 आर्गुमेंट, या हमारे मामले में, एक लाइन उपयोग करने के लिए कहता है। हम git clone के साथ अपनी कमांड बनाते हैं, जिसे xargs तब प्रत्येक लाइन के लिए निष्पादित करता है। ता-दा।

GitLab पर कई रिपॉजिटरी बनाने और पुश करने के लिए एक Bash वन-लाइनर

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

GitLab डॉक्स हमें git push --set-upstream का उपयोग करके एक नया प्रोजेक्ट बनाने के लिए पुश करने के लिए कहते हैं, लेकिन मुझे यह GitLab को बैकअप के रूप में उपयोग करने के लिए बहुत सुविधाजनक नहीं लगता। जैसे-जैसे मैं भविष्य में अपने रिपॉजिटरी के साथ काम करता हूं, मैं एक कमांड चलाना चाहूंगा जो बिना अतिरिक्त प्रयास के GitHub और GitLab दोनों पर पुश करे।

इस Bash वन-लाइनर को काम करने के लिए, हमें GitLab के लिए रिपॉजिटरी URLs की एक सूची की भी आवश्यकता होगी (जो अभी तक मौजूद नहीं हैं)। हम इसे आसानी से अपनी GitHub रिपॉजिटरी सूची को कॉपी करके, इसे Vim के साथ खोलकर, और खोज-और-प्रतिस्थापन करके कर सकते हैं:

cp gh-repos.txt gl-repos.txt
vim gl-repos.txt
:%s/\/gitlab/g
:wq

यह gl-repos.txt उत्पन्न करता है, जो इस तरह दिखता है:

git@gitlab.com:username/first-repository.git
git@gitlab.com:username/second-repository.git
git@gitlab.com:username/third-repository.git

हम इन रिपॉजिटरी को GitLab पर बना सकते हैं, URLs को रिमोट के रूप में जोड़ सकते हैं, और अपना कोड नए रिपॉजिटरी में पुश कर सकते हैं:

awk -F'\/|(\.git)' '{system("cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push")}' gl-repos.txt

थोड़ा रुकें और मैं इसे समझाऊंगा; अभी के लिए, ध्यान दें कि ~/FULL/PATH/ हमारे GitHub रिपॉजिटरी वाले डायरेक्टरी का पूरा पथ होना चाहिए।

हमें कुछ धारणाओं को नोट करना होगा:

  1. आपकी स्थानीय मशीन पर रिपॉजिटरी को शामिल करने वाले डायरेक्टरी का नाम URL में रिपॉजिटरी के नाम के समान है (यदि इसे ऊपर दिए गए वन-लाइनर के साथ क्लोन किया गया था तो यह मामला होगा);
  2. प्रत्येक रिपॉजिटरी वर्तमान में उस ब्रांच पर चेक आउट है जिसे आप पुश करना चाहते हैं, यानी master।

वन-लाइनर को इन धारणाओं को संभालने के लिए विस्तारित किया जा सकता है, लेकिन यह लेखक की विनम्र राय है कि उस बिंदु पर, हमें वास्तव में एक Bash स्क्रिप्ट लिखनी चाहिए।

यहां क्या हो रहा है?

हमारा Bash वन-लाइनर gl-repos.txt फाइल में प्रत्येक लाइन (या URL) को इनपुट के रूप में उपयोग करता है। awk के साथ, यह हमारे स्थानीय मशीन पर रिपॉजिटरी को शामिल करने वाले डायरेक्टरी के नाम को विभाजित करता है, और इन जानकारी के टुकड़ों का उपयोग हमारे बड़े कमांड को बनाने के लिए करता है। यदि हम awk के आउटपुट को print करते, तो हम देखते:

cd ~/FULL/PATH/first-repository && git remote set-url origin --add git@gitlab.com:username/first-repository.git && git push
cd ~/FULL/PATH/second-repository && git remote set-url origin --add git@gitlab.com:username/second-repository.git && git push
cd ~/FULL/PATH/third-repository && git remote set-url origin --add git@gitlab.com:username/third-repository.git && git push

आइए देखें कि हम इस कमांड को कैसे बनाते हैं।

awk के साथ स्ट्रिंग्स को विभाजित करना

टूल awk फील्ड सेपरेटर के आधार पर इनपुट को विभाजित कर सकता है। डिफ़ॉल्ट सेपरेटर एक व्हाइटस्पेस कैरेक्टर है, लेकिन हम -F फ्लैग पास करके इसे बदल सकते हैं। सिंगल कैरेक्टर के अलावा, हम एक रेगुलर एक्सप्रेशन फील्ड सेपरेटर का भी उपयोग कर सकते हैं। चूंकि हमारे रिपॉजिटरी URLs का एक सेट फॉर्मेट है, हम स्लैश कैरेक्टर / और URL के अंत, .git के बीच सबस्ट्रिंग मांगकर रिपॉजिटरी नाम प्राप्त कर सकते हैं।

इसे पूरा करने का एक तरीका हमारे रेगेक्स \/|(\.git) के साथ है:

  • \/ एक एस्केप किया गया / कैरेक्टर है;
  • | का अर्थ है "या", awk को किसी भी एक्सप्रेशन से मिलान करने के लिए कह रहा है;
  • (\.git) हमारे URL के अंत में कैप्चर ग्रुप है जो ".git" से मेल खाता है, एक एस्केप किए गए . कैरेक्टर के साथ। यह थोड़ा धोखा है, क्योंकि ".git" सख्ती से कुछ भी विभाजित नहीं कर रहा है (दूसरी तरफ कुछ भी नहीं है) लेकिन यह हमारे लिए इस बिट को हटाने का एक आसान तरीका है।

एक बार जब हम awk को बता देते हैं कि कहां विभाजित करना है, तो हम फील्ड ऑपरेटर के साथ सही सबस्ट्रिंग ले सकते हैं। हम अपने फील्ड को $ कैरेक्टर के साथ संदर्भित करते हैं, फिर फील्ड के कॉलम नंबर द्वारा। हमारे उदाहरण में, हम दूसरा फील्ड, $2 चाहते हैं। यहां सभी सबस्ट्रिंग्स इस तरह दिखते हैं:

1: git@gitlab.com:username
2: first-repository

पूरे स्ट्रिंग का उपयोग करने के लिए, या हमारे मामले में, पूरे URL का, हम फील्ड ऑपरेटर $0 का उपयोग करते हैं। कमांड लिखने के लिए, हम केवल रिपॉजिटरी नाम और URL के लिए फील्ड ऑपरेटर को प्रतिस्थापित करते हैं। इसे बनाते समय print के साथ चलाने से यह सुनिश्चित करने में मदद मिल सकती है कि हमें सभी स्पेस सही मिले हैं।

awk -F'\/|(\.git)' '{print "cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push"}' gl-repos.txt

कमांड चलाना

हम system() के पैरेंथेसिस के अंदर अपनी कमांड बनाते हैं। इसे awk के आउटपुट के रूप में उपयोग करके, प्रत्येक कमांड तब चलेगा जब इसे बनाया और आउटपुट किया जाता है। system() फंक्शन एक चाइल्ड प्रोसेस बनाता है जो हमारी कमांड को निष्पादित करता है, फिर कमांड पूरा होने पर लौटता है। सादे अंग्रेजी में, यह हमें हमारे मुख्य प्रोसेस से ब्रेक किए बिना प्रत्येक रिपॉजिटरी पर Git कमांड को एक-एक करके करने देता है जिसमें awk हमारे इनपुट फाइल के साथ चीजें कर रहा है। यहां हमारी अंतिम कमांड फिर से है, सभी एक साथ रखी गई।

awk -F'\/|(\.git)' '{system("cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push")}' gl-repos.txt

अपने बैकअप का उपयोग करना

GitLab URLs को रिमोट के रूप में जोड़कर, हमने दोनों बाहरी रूप से होस्ट किए गए रिपॉजिटरी में पुश करने की प्रक्रिया को सरल बना दिया है। यदि हम अपने रिपॉजिटरी डायरेक्टरी में से एक में git remote -v चलाते हैं, तो हम देखेंगे:

origin git@github.com:username/first-repository.git (fetch)
origin git@github.com:username/first-repository.git (push)
origin git@gitlab.com:username/first-repository.git (push)

अब, केवल आर्गुमेंट के बिना git push चलाने से वर्तमान ब्रांच दोनों रिमोट रिपॉजिटरी में पुश हो जाएगी।

हमें यह भी ध्यान देना चाहिए कि git pull आमतौर पर केवल उस रिमोट रिपॉजिटरी से खींचने की कोशिश करेगा जिसे आपने मूल रूप से क्लोन किया था (हमारे उदाहरण में (fetch) चिह्नित URL)। एक ही समय में कई Git रिपॉजिटरी से खींचना संभव है, लेकिन जटिल है, और इस पोस्ट के दायरे से परे है। कई रिमोट पर पुश और पुल करने में मदद करने के लिए यहां एक व्याख्या है, यदि आप उत्सुक हैं। रिमोट पर Git डॉक्यूमेंटेशन भी उपयोगी हो सकता है।

Bash वन-लाइनर्स की संक्षिप्तता पर विस्तार

समझे जाने पर Bash वन-लाइनर्स मजेदार और आसान शॉर्टकट हो सकते हैं। बहुत कम से कम, xargs और awk जैसे टूल के बारे में जागरूक होने से हमारे काम में बहुत सारी थकाऊता को स्वचालित और कम करने में मदद मिल सकती है। हालांकि, कुछ नकारात्मक पहलू हैं।

समझने में आसान, रखरखाव योग्य, और पहुंच योग्य टूल के संदर्भ में, Bash वन-लाइनर्स बेकार हैं। वे आमतौर पर if या while लूप का उपयोग करने वाले Bash स्क्रिप्ट की तुलना में लिखने में अधिक जटिल होते हैं, और निश्चित रूप से पढ़ने में अधिक जटिल होते हैं। यह संभावना है कि जब हम उन्हें लिखते हैं, तो हम कहीं एक सिंगल कोट या क्लोजिंग पैरेंथेसिस भूल जाएंगे; और जैसा कि मुझे आशा है कि यह पोस्ट प्रदर्शित करता है, उन्हें समझाने में भी काफी समय लग सकता है। तो उनका उपयोग क्यों करें?

केक बेक करने की एक रेसिपी पढ़ने की कल्पना करें, चरण दर चरण। आप विधियों और सामग्रियों को समझते हैं, और अपनी आपूर्ति इकट्ठा करते हैं। फिर, जैसे ही आप इसके बारे में सोचते हैं, आप यह महसूस करना शुरू करते हैं कि यदि आप सभी सामग्रियों को ठीक सही क्रम में ओवन पर फेंक देते हैं, तो एक केक तुरंत भौतिक हो जाएगा। आप इसे आजमाते हैं, और यह काम करता है!

यह बहुत संतोषजनक होगा, है ना?

  1. Git Bash के माध्यम से Windows पर Sublime Text लॉन्च करें – चरण-दर-चरण गाइड Git Bash के माध्यम से Windows पर Sublime Text लॉन्च करें – चरण-दर-चरण गाइड

    यदि आप यह पता लगाने की कोशिश कर रहे हैं कि Git bash से Sublime Text एडिटर कैसे खोलें, तो आप भाग्यशाली हैं। यह लेख आपको कम या बिना किसी तनाव के इस प्रक्रिया के माध्यम से मार्गदर्शन करेगा। मुझे यह पता लगाने में कुछ समय लगा कि यह कैसे किया जाता है, लेकिन अब मैं इस लेख में आप सभी के साथ उस ज्ञान को साझा

  1. Bash में मास्टरी: एक अनुकूलित Linux अनुभव के लिए टर्मिनल रंग और प्रॉम्प्ट अनुकूलित करें Bash में मास्टरी: एक अनुकूलित Linux अनुभव के लिए टर्मिनल रंग और प्रॉम्प्ट अनुकूलित करें

    आज, Bash अधिकांश (यदि सभी नहीं) आधुनिक Linux वितरणों में डिफ़ॉल्ट शेल है। हालांकि, आपने देखा होगा कि टर्मिनल में टेक्स्ट रंग और प्रॉम्प्ट सामग्री एक डिस्ट्रो से दूसरे में भिन्न हो सकती है। सुझाव पढ़ें: Linux के लिए 5 सबसे अधिक उपयोग किए जाने वाले ओपन सोर्स शेल्स यदि आप सोच रहे हैं कि बेहतर पहुंच या

  1. कस्टम शेल फंक्शन्स और लाइब्रेरीज़ मास्टर करें: लिनक्स उपयोगकर्ताओं के लिए व्यावहारिक मार्गदर्शिका कस्टम शेल फंक्शन्स और लाइब्रेरीज़ मास्टर करें: लिनक्स उपयोगकर्ताओं के लिए व्यावहारिक मार्गदर्शिका

    लिनक्स में, शेल स्क्रिप्ट्स कई अलग-अलग तरीकों से हमारी मदद करती हैं जिनमें कुछ सिस्टम एडमिनिस्ट्रेशन कार्यों को करने या यहां तक कि स्वचालित करना, सरल कमांड लाइन टूल्स बनाना और बहुत कुछ शामिल है। इस गाइड में, हम नए लिनक्स उपयोगकर्ताओं को दिखाएंगे कि कस्टम शेल स्क्रिप्ट्स को विश्वसनीय रूप से कहां स्टो