जवाबों:
मुझे लगता है कि आप रिमोट साइड पर एक नंगे भंडार बनाते हैं, git init --bare
अपने स्थानीय रिपॉजिटरी ( git remote add origin URL
) के लिए रिमोट साइड को पुश / पुल ट्रैकर के रूप में जोड़ते हैं , और फिर स्थानीय रूप से आप बस कहते हैं git push origin master
। अब pull
दूरस्थ रिपॉजिटरी से कोई अन्य रिपॉजिटरी हो सकती है।
git push origin master
"रिपॉजिटरी नहीं मिला" त्रुटि के साथ विफल हो जाता है, तो git update-server-info
रिमोट साइड पर प्रयास करें , जहां आपने किया थाgit init --bare
git update-server-info
, लेकिन मैं त्रुटि हो रही है fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
प्रारंभ में किसी भी Git सर्वर को सेट करने के लिए, आपको एक मौजूदा रिपॉजिटरी को एक नए नंगे रिपॉजिटरी में निर्यात करना होगा - एक रिपॉजिटरी जिसमें एक कार्यशील निर्देशिका नहीं है। यह आमतौर पर करने के लिए सीधा है। एक नए नंगे भंडार को बनाने के लिए अपने भंडार को क्लोन करने के लिए, आप --bare
विकल्प के साथ क्लोन कमांड चलाते हैं । सम्मेलन के द्वारा, नंगे भंडार निर्देशिकाएं समाप्त होती हैं .git
, जैसे:
$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/
यह कमांड Git रिपॉजिटरी को एक कार्यशील निर्देशिका के बिना, अपने आप में ले जाता है, और विशेष रूप से अकेले इसके लिए एक निर्देशिका बनाता है।
अब जब आपके पास अपनी रिपॉजिटरी की एक नंगी कॉपी है, तो आपको बस इसे सर्वर पर रखना होगा और अपने प्रोटोकॉल सेट करने होंगे। मान लीजिए कि आपने एक सर्वर स्थापित किया है जिसका नाम है git.example.com
कि आपके पास एसएसएच एक्सेस है, और आप /opt/git
निर्देशिका के तहत अपने सभी गिट रिपॉजिटरी को स्टोर करना चाहते हैं । आप अपने नंगे भंडार पर कॉपी करके अपना नया भंडार स्थापित कर सकते हैं:
$ scp -r my_project.git user@git.example.com:/opt/git
इस बिंदु पर, अन्य उपयोगकर्ता जिनके पास SSH की उसी सर्वर तक पहुंच है, जिनके पास /opt/git
निर्देशिका तक रीड-एक्सेस है, वे आपके रिपॉजिटरी को क्लोन करके चला सकते हैं
$ git clone user@git.example.com:/opt/git/my_project.git
यदि कोई उपयोगकर्ता सर्वर में एसएसएच करता है और /opt/git/my_project.git
निर्देशिका तक पहुंच लिखता है , तो उनके पास स्वचालित रूप से पुश एक्सेस भी होगा। यदि आप --shared
विकल्प के साथ git init कमांड चलाते हैं, तो Git एक रिपॉजिटरी में समूह लिखने की अनुमति को स्वचालित रूप से जोड़ देगा ।
$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared
Git रिपॉजिटरी लेना, नंगे संस्करण बनाना और इसे एक सर्वर पर रखना आसान है, जिस पर आप और आपके सहयोगियों के पास SSH का उपयोग हो। अब आप उसी प्रोजेक्ट पर सहयोग करने के लिए तैयार हैं।
scp
समाधान की तुलना में व्यवहार में IMO बेहतर काम करता है init --bare
। यह अभी भी एक बदसूरत हैक की तरह महसूस करता है, हालांकि पहले स्थानीय स्तर पर क्लोन किया जाता है, फिर सर्वर पर कॉपी किया जाता है ... काश git के पास इसे एक बार में करने की आज्ञा होती।
--shared
मेरे लिए काम करता है। मुझे आश्चर्य है कि अगर आप git init --shared
एक बनाने के बिना उपयोग करते हैं तो क्या होता है --bare
...
scp
अगर रिमोट सपोर्ट नहीं करता है तो बेहतर तरीके से काम करता है git init --bare
(जैसा कि मेरे लिए git 1.5.5, 2008 में हुआ था)। मुझे लगता है कि यह काम करना चाहिए, भले ही रिमोट में कोई जिट न हो।
उन लोगों के लिए एक नोट जो विंडोज पर स्थानीय कॉपी बनाते हैं और एक यूनिक्स-लाइन सिस्टम पर एक संबंधित रिमोट रिपॉजिटरी बनाना चाहते हैं, जहां टेक्स्ट फाइलें यूनिक्स जैसे सिस्टम पर डेवलपर्स द्वारा आगे के क्लोन पर एलएफ एंडिंग प्राप्त करती हैं, लेकिन विंडोज के लिए सीआरएलएफ एंडिंग।
यदि आपने लाइन-एंडिंग ट्रांसलेशन स्थापित करने से पहले अपना विंडोज रिपॉजिटरी बनाया है तो आपको समस्या है। Git की डिफ़ॉल्ट सेटिंग कोई अनुवाद नहीं है, इसलिए आपका काम करने वाला सेट CRLF का उपयोग करता है लेकिन आपकी रिपॉजिटरी (यानी .it के तहत संग्रहीत डेटा) ने फ़ाइलों को CRLF के रूप में भी सहेजा है।
जब आप दूरस्थ पर धकेलते हैं, तो सहेजी गई फ़ाइलों को कॉपी किया जाता है, जैसा कि कोई भी लाइन समाप्त होने वाला अनुवाद नहीं होता है। (लाइन एंडिंग ट्रांसलेशन तब होता है जब फ़ाइलों को रिपॉजिटरी में भेजा जाता है, रिपॉजिटरी को पुश करने पर नहीं)। आप अपने यूनिक्स-जैसे रिपॉजिटरी में CRLF के साथ अंत करते हैं, जो कि आप नहीं चाहते हैं।
दूरस्थ रिपॉजिटरी में एलएफ पाने के लिए आपको अपने विंडोज रिपॉजिटरी को फिर से सामान्य करके एलएफ को पहले स्थानीय रिपॉजिटरी में सुनिश्चित करना होगा । इससे आपके विंडोज वर्किंग सेट पर कोई असर नहीं दिखाई देगा, जिसमें अभी भी CRLF की एंडिंग है, हालांकि जब आप रिमोट से पुश करते हैं, तो रिमोट से LF सही तरीके से मिल जाएगा।
मुझे यकीन नहीं है कि आपके विंडोज रिपॉजिटरी में क्या लाइन एंडिंग है, यह बताने का एक आसान तरीका है - मुझे लगता है कि आप इसे core.autocrlf = false और फिर क्लोनिंग सेट करके टेस्ट कर सकते हैं (यदि रेपो में LF एंडिंग है, तो क्लोन होगा LF भी)।
उपरोक्त दो लोकप्रिय समाधानों के बीच एक दिलचस्प अंतर है:
यदि आप इस तरह से नंगे भंडार बनाते हैं:
cd / out_of_any_repo mkdir my_remote.git cd my_remote.git git init --bare
और फिर
cd /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master
फिर git इस संबंध के साथ 'original_repo' में कॉन्फ़िगरेशन सेट करता है:
original_repo origin --> /outside_of_any_repo/my_remote.git/
अपस्ट्रीम रिमोट के रूप में बाद के साथ। और अपस्ट्रीम रिमोट का इसके कॉन्फ़िगरेशन में कोई अन्य उपाय नहीं है।
हालाँकि, यदि आप इसे दूसरे तरीके से करते हैं:
(डायरेक्टरी ओरिजिनल_रेपो से) सीडी .. git clone --bare original_repo /outside_of_any_repo/my_remote.git
तब 'my_remote.git' अपने कॉन्फ़िगरेशन को 'मूल' के साथ हवा देता है, जो 'original_repo' को एक दूरस्थ के रूप में इंगित करता है, एक दूरस्थ के साथ। aur .in.url स्थानीय निर्देशिका पथ के समतुल्य है, जो कि स्थानांतरित होने जा रहा है तो उचित नहीं हो सकता है। एक सर्वर के लिए।
हालांकि उस "दूरस्थ" संदर्भ को बाद में छुटकारा पाना आसान है यदि यह उचित नहीं है, तो 'original_repo' को अभी भी अप-स्ट्रीम रिमोट के रूप में 'my_remote.git' को इंगित करने के लिए सेट किया जाना है (या जहां भी जा रहा है) से साझा किया जाएगा)। तो तकनीकी रूप से, आप दृष्टिकोण # 2 के साथ कुछ और चरणों के साथ एक ही परिणाम पर पहुंच सकते हैं। लेकिन # 1 एक स्थानीय केंद्रीय से उत्पन्न "केंद्रीय नंगे साझा रेपो" बनाने के लिए एक अधिक प्रत्यक्ष दृष्टिकोण लगता है, कम कदमों के साथ, सर्वर पर जाने के लिए उपयुक्त है। मुझे लगता है कि यह उस भूमिका पर निर्भर करता है जिसे आप दूरस्थ रेपो खेलना चाहते हैं। (और हाँ, यह यहाँ प्रलेखन के साथ संघर्ष में है ।)
कैविएट: मैंने अपने स्थानीय सिस्टम पर एक वास्तविक रेपो के साथ एक परीक्षण करके और फिर परिणामों के बीच फाइल-बाय-फाइल तुलना करके उपरोक्त (इस लेखन में अगस्त 2019 में) सीखा। परंतु! मैं अभी भी सीख रहा हूं, इसलिए अधिक सही तरीका हो सकता है। लेकिन मेरे परीक्षणों ने मुझे यह निष्कर्ष निकालने में मदद की है कि # 1 मेरी वर्तमान-पसंदीदा पद्धति है।
रिमोट रिपॉजिटरी आम तौर पर एक नंगे रिपॉजिटरी है - एक गिट रिपॉजिटरी जिसमें कोई कार्यशील निर्देशिका नहीं है। क्योंकि रिपॉजिटरी का उपयोग केवल सहयोग बिंदु के रूप में किया जाता है, इसलिए स्नैपशॉट को डिस्क पर चेक आउट करने का कोई कारण नहीं है; यह सिर्फ Git डेटा है। सबसे सरल शब्दों में, एक नंगे रिपॉजिटरी आपके प्रोजेक्ट की .गित निर्देशिका की सामग्री है और कुछ नहीं।
आप निम्नलिखित कोड के साथ एक नंगे गिट रिपॉजिटरी बना सकते हैं:
$ git clone --bare /path/to/project project.git
दूरस्थ गिट रिपॉजिटरी के लिए एक विकल्प SSH प्रोटोकॉल का उपयोग कर रहा है:
एसएसएच के ऊपर सेल्फ-होस्टिंग होने पर गिट के लिए एक सामान्य परिवहन प्रोटोकॉल। ऐसा इसलिए है क्योंकि सर्वर पर SSH की पहुंच पहले से ही अधिकांश स्थानों पर है - और यदि ऐसा नहीं है, तो यह करना आसान है। SSH भी एक प्रमाणित नेटवर्क प्रोटोकॉल है और, क्योंकि यह सर्वव्यापी है, इसे आमतौर पर स्थापित करना और उपयोग करना आसान है।
SSH पर Git रिपॉजिटरी को क्लोन करने के लिए, आप
ssh://
इस तरह से एक URL निर्दिष्ट कर सकते हैं :$ git clone ssh://[user@]server/project.git
या आप SSH प्रोटोकॉल के लिए छोटे scp जैसे सिंटैक्स का उपयोग कर सकते हैं:
$ git clone [user@]server:project.git
उपरोक्त दोनों मामलों में, यदि आप वैकल्पिक उपयोगकर्ता नाम निर्दिष्ट नहीं करते हैं, तो Git उस उपयोगकर्ता को मानता है जिसे आप वर्तमान में लॉग इन कर रहे हैं।
गुण
एसएसएच का उपयोग करने के नियम कई हैं। सबसे पहले, SSH को स्थापित करना अपेक्षाकृत आसान है - SSH डेमॉन आम बात है, कई नेटवर्क व्यवस्थापक उनके साथ अनुभव रखते हैं, और कई ओएस वितरण उनके साथ सेट किए जाते हैं या उन्हें प्रबंधित करने के लिए उपकरण होते हैं। अगला, SSH पर पहुंच सुरक्षित है - सभी डेटा ट्रांसफर एन्क्रिप्ट और प्रमाणित है। अंतिम, HTTPS, Git और स्थानीय प्रोटोकॉल की तरह, SSH कुशल है, जिससे डेटा को स्थानांतरित करने से पहले कॉम्पैक्ट किया जा सके।
विपक्ष
SSH का नकारात्मक पहलू यह है कि यह आपके Git रिपॉजिटरी में अनाम पहुँच का समर्थन नहीं करता है। यदि आप SSH का उपयोग कर रहे हैं, तो लोगों को आपकी मशीन तक SSH की पहुंच होनी चाहिए, यहां तक कि केवल-पढ़ने की क्षमता में, जो SSH को स्रोत परियोजनाओं को खोलने के लिए अनुकूल नहीं बनाता है, जिसके लिए लोग बस इसे जांचने के लिए आपके भंडार का क्लोन बनाना चाहते हैं। यदि आप इसे केवल अपने कॉर्पोरेट नेटवर्क के भीतर उपयोग कर रहे हैं, तो SSH एकमात्र प्रोटोकॉल हो सकता है, जिससे आपको निपटना होगा। यदि आप अपनी परियोजनाओं तक केवल अनाम पढ़ने की अनुमति देना चाहते हैं और SSH का उपयोग करना चाहते हैं, तो आपको धक्का देने के लिए SSH की स्थापना करनी होगी, लेकिन दूसरों से लाने के लिए कुछ और।
अधिक जानकारी के लिए, संदर्भ देखें: सर्वर पर गेट - प्रोटोकॉल
आपको दूरस्थ सर्वर पर निर्देशिका बनाने की आवश्यकता है। फिर इसे रिपॉजिटरी के रूप में सेट करने के लिए "गिट इनिट" कमांड का उपयोग करें। यह आपके द्वारा की गई प्रत्येक नई परियोजना के लिए किया जाना चाहिए (प्रत्येक नया फ़ोल्डर)
मान लें कि आपने पहले ही सेटअप किया है और ssh कीज़ का उपयोग करके git का उपयोग किया है, मैंने एक छोटी पायथन स्क्रिप्ट लिखी है, जिसे जब एक वर्किंग डाइरेक्टरी से निष्पादित किया जाता है तो एक रिमोट सेट करेगा और डाइरेक्टरी को git रेपो के रूप में इनिशियलाइज़ करेगा। बेशक, आपको सभी रिपॉजिटरी के लिए इसे सर्वर और रूट पथ बताने के लिए स्क्रिप्ट (केवल एक बार) को संपादित करना होगा।
यहां देखें - https://github.com/skbobade/ocgi
आम तौर पर आप केवल init
कमांड का उपयोग करके एक git रेपो सेट कर सकते हैं
git init
आपके मामले में, पहले से ही उपलब्ध रिमोट पर एक रेपो है। इस बात पर निर्भर है कि आप अपने रिमोट रेपो तक कैसे पहुँच सकते हैं (उपयोगकर्ता नाम के साथ url या ssh कुंजी जो सत्यापन को संभालती है) केवल clone
कमांड का उपयोग करें :
git clone git@[my.url.com]:[git-repo-name].git
रेपो को क्लोन करने के अन्य तरीके भी हैं। इस तरह से आप इसे कॉल करते हैं यदि आपके पास आपकी मशीन पर एक ssh कुंजी सेटअप है जो आपके रिपॉजिटरी को खींचने पर सत्यापित करता है। यदि आप अपने दूरस्थ रिपॉजिटरी में लॉगिन करने के लिए अपने पासवर्ड और उपयोगकर्ता नाम को शामिल करना चाहते हैं, तो url के अन्य संयोजन हैं।