एक स्थानीय से एक दूरस्थ गिट रिपॉजिटरी कैसे बनाएं?


243

मेरे पास स्थानीय गिट भंडार है। मैं इसे दूरस्थ, ssh- सक्षम, सर्वर पर उपलब्ध कराना चाहूंगा। मैं यह कैसे करु?

जवाबों:


288

मुझे लगता है कि आप रिमोट साइड पर एक नंगे भंडार बनाते हैं, git init --bareअपने स्थानीय रिपॉजिटरी ( git remote add origin URL) के लिए रिमोट साइड को पुश / पुल ट्रैकर के रूप में जोड़ते हैं , और फिर स्थानीय रूप से आप बस कहते हैं git push origin master। अब pullदूरस्थ रिपॉजिटरी से कोई अन्य रिपॉजिटरी हो सकती है।


@ निप्स: हाँ, ठीक है, क्षमा करें। आप व्यक्तिगत शाखाओं को धक्का देते हैं, वास्तव में!
केरेक एसबी

यदि मैं GUI का उपयोग कर रहा हूं तो क्या होगा? मैं एक ही नेटवर्क पर सभी रिपॉजिटरी और प्रत्येक पीसी के लिए एक सर्वर कैसे सेट कर सकता हूं?
SearchForKnowledge

4
अगर git push origin master"रिपॉजिटरी नहीं मिला" त्रुटि के साथ विफल हो जाता है, तो git update-server-infoरिमोट साइड पर प्रयास करें , जहां आपने किया थाgit init --bare
हांगकांग

7
@KerrekSB यह संभव है कि जैसे ही मैं अपने लोकल पर git पुश ओरिजिन मास्टर
चलाऊंगा

@HongKilDong मैंने कोशिश की git update-server-info, लेकिन मैं त्रुटि हो रही है fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
नायेफ

81

प्रारंभ में किसी भी 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 का उपयोग हो। अब आप उसी प्रोजेक्ट पर सहयोग करने के लिए तैयार हैं।


6
scpसमाधान की तुलना में व्यवहार में IMO बेहतर काम करता है init --bare। यह अभी भी एक बदसूरत हैक की तरह महसूस करता है, हालांकि पहले स्थानीय स्तर पर क्लोन किया जाता है, फिर सर्वर पर कॉपी किया जाता है ... काश git के पास इसे एक बार में करने की आज्ञा होती।
21

1
+ 1 क्योंकि यह --sharedमेरे लिए काम करता है। मुझे आश्चर्य है कि अगर आप git init --sharedएक बनाने के बिना उपयोग करते हैं तो क्या होता है --bare...
आइडेडवाटर

1
स्थानीय रूप से एक नंगे रिपॉजिटरी बनाएं और scpअगर रिमोट सपोर्ट नहीं करता है तो बेहतर तरीके से काम करता है git init --bare(जैसा कि मेरे लिए git 1.5.5, 2008 में हुआ था)। मुझे लगता है कि यह काम करना चाहिए, भले ही रिमोट में कोई जिट न हो।
यारोस्लाव निकितेंको

1
संदर्भ: git-scm.com/book/en/v1/…
berbt

1
एक मामूली नोट: समाधान का स्टेप स्कैप सही है, लेकिन यह काम करता है यदि दूरस्थ उपयोगकर्ता के पास एक नियमित शेल है, यदि उपयोगकर्ता एक गिट-शेल का उपयोग करता है तो यह काम नहीं करेगा।
user1708042

9

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

यदि आपने लाइन-एंडिंग ट्रांसलेशन स्थापित करने से पहले अपना विंडोज रिपॉजिटरी बनाया है तो आपको समस्या है। Git की डिफ़ॉल्ट सेटिंग कोई अनुवाद नहीं है, इसलिए आपका काम करने वाला सेट CRLF का उपयोग करता है लेकिन आपकी रिपॉजिटरी (यानी .it के तहत संग्रहीत डेटा) ने फ़ाइलों को CRLF के रूप में भी सहेजा है।

जब आप दूरस्थ पर धकेलते हैं, तो सहेजी गई फ़ाइलों को कॉपी किया जाता है, जैसा कि कोई भी लाइन समाप्त होने वाला अनुवाद नहीं होता है। (लाइन एंडिंग ट्रांसलेशन तब होता है जब फ़ाइलों को रिपॉजिटरी में भेजा जाता है, रिपॉजिटरी को पुश करने पर नहीं)। आप अपने यूनिक्स-जैसे रिपॉजिटरी में CRLF के साथ अंत करते हैं, जो कि आप नहीं चाहते हैं।

दूरस्थ रिपॉजिटरी में एलएफ पाने के लिए आपको अपने विंडोज रिपॉजिटरी को फिर से सामान्य करके एलएफ को पहले स्थानीय रिपॉजिटरी में सुनिश्चित करना होगा । इससे आपके विंडोज वर्किंग सेट पर कोई असर नहीं दिखाई देगा, जिसमें अभी भी CRLF की एंडिंग है, हालांकि जब आप रिमोट से पुश करते हैं, तो रिमोट से LF सही तरीके से मिल जाएगा।

मुझे यकीन नहीं है कि आपके विंडोज रिपॉजिटरी में क्या लाइन एंडिंग है, यह बताने का एक आसान तरीका है - मुझे लगता है कि आप इसे core.autocrlf = false और फिर क्लोनिंग सेट करके टेस्ट कर सकते हैं (यदि रेपो में LF एंडिंग है, तो क्लोन होगा LF भी)।


5

उपरोक्त दो लोकप्रिय समाधानों के बीच एक दिलचस्प अंतर है:

  1. यदि आप इस तरह से नंगे भंडार बनाते हैं:

    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/

अपस्ट्रीम रिमोट के रूप में बाद के साथ। और अपस्ट्रीम रिमोट का इसके कॉन्फ़िगरेशन में कोई अन्य उपाय नहीं है।

  1. हालाँकि, यदि आप इसे दूसरे तरीके से करते हैं:

    (डायरेक्टरी ओरिजिनल_रेपो से)
    सीडी ..
    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 मेरी वर्तमान-पसंदीदा पद्धति है।


4

रिमोट रिपॉजिटरी आम तौर पर एक नंगे रिपॉजिटरी है - एक गिट रिपॉजिटरी जिसमें कोई कार्यशील निर्देशिका नहीं है। क्योंकि रिपॉजिटरी का उपयोग केवल सहयोग बिंदु के रूप में किया जाता है, इसलिए स्नैपशॉट को डिस्क पर चेक आउट करने का कोई कारण नहीं है; यह सिर्फ 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 की स्थापना करनी होगी, लेकिन दूसरों से लाने के लिए कुछ और।

अधिक जानकारी के लिए, संदर्भ देखें: सर्वर पर गेट - प्रोटोकॉल


3

आपको दूरस्थ सर्वर पर निर्देशिका बनाने की आवश्यकता है। फिर इसे रिपॉजिटरी के रूप में सेट करने के लिए "गिट इनिट" कमांड का उपयोग करें। यह आपके द्वारा की गई प्रत्येक नई परियोजना के लिए किया जाना चाहिए (प्रत्येक नया फ़ोल्डर)

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

यहां देखें - https://github.com/skbobade/ocgi


-3

आम तौर पर आप केवल initकमांड का उपयोग करके एक git रेपो सेट कर सकते हैं

git init

आपके मामले में, पहले से ही उपलब्ध रिमोट पर एक रेपो है। इस बात पर निर्भर है कि आप अपने रिमोट रेपो तक कैसे पहुँच सकते हैं (उपयोगकर्ता नाम के साथ url या ssh कुंजी जो सत्यापन को संभालती है) केवल cloneकमांड का उपयोग करें :

git clone git@[my.url.com]:[git-repo-name].git

रेपो को क्लोन करने के अन्य तरीके भी हैं। इस तरह से आप इसे कॉल करते हैं यदि आपके पास आपकी मशीन पर एक ssh कुंजी सेटअप है जो आपके रिपॉजिटरी को खींचने पर सत्यापित करता है। यदि आप अपने दूरस्थ रिपॉजिटरी में लॉगिन करने के लिए अपने पासवर्ड और उपयोगकर्ता नाम को शामिल करना चाहते हैं, तो url के अन्य संयोजन हैं।


1
यह कितना विडंबनापूर्ण है .... किसी ने आज केवल इस उत्तर को अस्वीकार कर दिया है, और अब मैं अपनी फाइलों को आगे बढ़ाने के लिए संघर्ष कर रहा हूं। ऐसा लगता है कि मुझे इसमें फिर से आने के लिए कुछ कसरत की जरूरत है!
एलेक्स Cio

7
मुझे लगता है कि समस्या यह है कि ओपी एक ssh सर्वर पर एक रिमोट रेपो बनाने के लिए एक समाधान चाहता था, लेकिन आपने वर्णित किया कि एक दूरस्थ ssh सर्वर से स्थानीय रेपो कैसे बनाया जाए। आपने प्रश्न का उत्तर नहीं दिया। (नहीं मैं नीचे था।)
पीटर -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.