नेटवर्क एक्सेस के बिना कई सिस्टम पर Git का उपयोग करना


84

मैं संस्करण नियंत्रण का उपयोग करना चाहता हूं लेकिन, सुरक्षा कारणों से, जिस सर्वर पर मैं काम कर रहा हूं, उसमें कोई इंटरनेट नहीं है: मैं केवल एक यूएसबी ड्राइव पर फ़ाइलों को स्थानांतरित कर सकता हूं। क्या मैं अभी भी इस सेटअप के साथ Git का उपयोग कर सकता हूं? क्या मैं छोटे पैच बना सकता हूं जिसे मैं गिट रिपॉजिटरी पर लागू कर सकता हूं?


65
आपका शीर्षक कहता है कि कोई नेटवर्क एक्सेस नहीं है, आपका प्रश्न कहता है कि कोई इंटरनेट एक्सेस नहीं है; एक बड़ा अंतर।
tkausl

7
@TutuKaeen आपके पास एक स्थानीय नेटवर्क हो सकता है जो इंटरनेट से जुड़ा नहीं है। इसलिए github.com के बजाय आप उदाहरण के लिए git सर्वर सेट करें। 192.168.1.100 और बाकी सब कुछ समान काम करता है।
Agent_L

12
@TutuKaeen: महत्वपूर्ण प्रश्न यह है कि क्या दो मशीनों के बीच सीधा (या अप्रत्यक्ष) नेटवर्क संचार संभव है। तो आपके मामले में, दोनों मशीनें नेटवर्क हैं, लेकिन नेटवर्क अलग हो गए हैं? उस स्थिति में, कृपया उस जानकारी को अपने प्रश्न में संपादित करें।
साल्स्के

15
@TutuKaeen आपका प्रश्न अस्पष्ट है। आप कहते हैं कि आप संस्करण नियंत्रण का उपयोग करना चाहते हैं, लेकिन आपकी टिप्पणियों में आपको आवश्यकता है कि यह उत्पादन में आपकी सहायता करे। ये मुद्दे हमेशा ओवरलैप नहीं होते हैं। मुझे लगता है कि आपके पास अभी नीचे अच्छे उत्तर हैं, लेकिन भविष्य में यह उपयोगी होगा यदि आपका प्रश्न आपकी आवश्यकताओं के बारे में अधिक व्यापक था, जो प्रतीत होता है: "मैं संस्करण नियंत्रण का उपयोग करना चाहता हूं, मेरी विकास मशीन में इंटरनेट का उपयोग नहीं है। इसमें नेटवर्क एक्सेस तो है, लेकिन प्रोडक्शन मशीन तक नहीं है, और मैं जानना चाहता हूं कि प्रोडक्शन मशीन पर वर्जन कंट्रोल से कोड कैसे निकाला जाए। "
डेविड

4
serverकिसी भी नेटवर्क से कनेक्ट नहीं होने वाली मशीन के लिए इस शब्द का उपयोग करना अजीब लगता है । यह इंटरनेट एक्सेस के बिना भी केवल एक स्थानीय नेटवर्क हो सकता है लेकिन फिर भी यह एक नेटवर्क है।
पैट्रिक ग्रेगोरियो

जवाबों:


157

निश्चित रूप से, Git के बारे में कुछ भी नहीं है जिसके लिए एक विशेष प्रोटोकॉल की आवश्यकता होती है। बॉक्स से बाहर मानक क्लाइंट HTTP (S), SSH, कस्टम Git प्रोटोकॉल और, महत्वपूर्ण रूप से, स्थानीय प्रोटोकॉल का समर्थन करता है। यह सिर्फ एक स्थानीय .gitनिर्देशिका के लिए एक रास्ता लेता है , जो कार्यशील निर्देशिका ( /path/to/project/.git) या सिर्फ एक नंगे निर्देशिका ( /path/to/project.git) के भीतर हो सकता है , हालांकि नामकरण सिर्फ एक सम्मेलन है।

इसका मतलब है कि आप निश्चित रूप से, रिमोट के रूप में एक फ्लैश ड्राइव जोड़ सकते हैं:

git remote add origin /mnt/flashdrive/foo.git

या, विंडोज पर:

git remote add origin F:\foo.git

या इसे एक अलग नाम के साथ एक अतिरिक्त रिमोट के रूप में भी जोड़ें (यदि आप originकहीं इंटरनेट सर्वर की ओर इंगित करना चाहते हैं ):

git remote add flashdrive /mnt/flashdrive/foo.git

तब आप किसी अन्य की तरह इस रिमोट से बस पुश / पुल / कर सकते हैं।

यदि आप दस्तावेज़ पढ़ते हैं , तो आप देखेंगे file://कि एक प्रोटोकॉल भी है जो थोड़ा अलग तरीके से व्यवहार करता है। स्थानीय पथ का उपयोग करने की अनुशंसा की जाती है क्योंकि यह कुछ अतिरिक्त अनुकूलन का उपयोग करेगा - यदि आप file://प्रोटोकॉल का उपयोग करते हैं तो गिट कुछ मानक नेटवर्क घटकों (स्थानीय डिस्क पर बात करने के लिए) का उपयोग करेगा, जो धीमा है।


50
इस असाधारण उत्तर को जोड़ने के लिए - फ्लैश ड्राइव पर 'नंगे' रिपोजिटरी का उपयोग करके जांच करना भी सार्थक हो सकता है। 'नंगे' रिपॉजिटरी में एक काम करने वाला पेड़ नहीं होता है, और इसलिए संभावित मुद्दों की एक श्रेणी को काट दिया जाता है जब एक साझा 'पॉइंट ऑफ अथॉरिटी' के रूप में उपयोग किया जाता है, जो ओपी के उपयोग-मामले की तरह लगता है।
आयरन ग्रेमलिन

5
यह file://भी थोड़ा अधिक लचीला है। यह आपको कुछ सुविधाओं (जैसे उथले क्लोन) का उपयोग करने की अनुमति देता है जो आप स्थानीय पथ के साथ नहीं कर सकते हैं।
ऑस्टिन हेमेलर्गरन

1
@IronGremlin क्या आप इस "अधिकार के साझा बिंदु" धारणा पर विस्तार कर सकते हैं? मैं एक गिट विशेषज्ञ नहीं हूं और मैं उत्सुक हूं कि आपके द्वारा इसका क्या मतलब है।
ऑर्बिट

2
@LightnessRacesinOrbit - यह एक बहुत ही घना विषय है, लेकिन, मूल रूप से, गिट वितरित किया जाता है, इसलिए हर किसी को अपना इतिहास मिलता है। A, B से उनके इतिहास के संस्करण के लिए पूछ सकता है, लेकिन C इसके बारे में तब तक नहीं जानता जब तक कि कोई उन्हें नहीं बताता। 'आधिकारिक' इतिहास को संग्रहीत करने के लिए एक एकल भंडार होने का मतलब है कि डी इतिहास के लिए समाशोधन गृह के रूप में कार्य करता है। इसलिए, A, D को परिवर्तनों के बारे में बताता है, और B और C, आपस में साइड-चैनल सामान करने के बजाय D से अद्यतित रहने के लिए बात करना जानते हैं। बिंदु में मामला, अगर ओपी का सर्वर सी और फ्लैश ड्राइव डी है, तो यह सुनिश्चित करता है कि सर्वर ए / बी बातचीत से बाहर नहीं निकलता है।
आयरन ग्रेमलिन

6
@LightnessRacesinOrbit यहां यह ध्यान रखना महत्वपूर्ण है कि नंगे का अर्थ आधिकारिक नहीं है, यह केवल उस संदर्भ में उपयोगी है। उदाहरण के लिए, यह उपयोगी भी है, क्योंकि काम करने वाले पेड़ की कमी है, यह एक छोटा डिस्कस्पेस (या बैंडविड्थ) है। यह अब की तुलना में बहुत अधिक महत्वपूर्ण का एक नरक हुआ करता था, लेकिन अभी भी आता है।
आयरन ग्रेमलिन

46

एक पर एक कंप्यूटर, कुछ खास नहीं की जरूरत है। git initअपनी इच्छित निर्देशिका में चलाएं और Git के साथ काम करें जैसा कि आप सामान्य रूप से करेंगे।

कई कंप्यूटरों में एक रिपॉजिटरी को सिंक्रनाइज़ करने के लिए , कई तरीके हैं।

विधि 1a (कोई नेटवर्क बिल्कुल नहीं): आप USB स्टिक पर 'नंगे रिपॉजिटरी' बना सकते हैं, फिर इसे पुश करें और इसे किसी अन्य दूरस्थ रिपॉजिटरी के साथ खींच लें। दूसरे शब्दों में, स्थानीय पथों के माध्यम से रिपॉजिटरी ऑपरेशन एसएसएच या एचटीटीपीएस यूआरएल के माध्यम से संचालन से अलग नहीं हैं।

  1. एक 'दूरस्थ' भंडार बनाएँ:

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. कंप्यूटर 1 में, इसे सब कुछ पुश करें:

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. कंप्यूटर 2 में, अच्छी तरह से, हमेशा की तरह।

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(आप किसी URL या पथ से सीधे / भी धक्का / खींच सकते हैं)

विधि 1 बी (आंतरिक नेटवर्क): यदि आपके पास एसएसएच के साथ एक आंतरिक सर्वर उपलब्ध है, और यदि इसमें जीआईटी स्थापित है, तो आप ऊपर जैसा ही कर सकते हैं , बस [user@]host:pathया ssh://[user@]host/pathसिंटैक्स का उपयोग करके एसएसएच पता निर्दिष्ट करें ।

  1. git init --bare <somepath.git>नामित सर्वर (SSH के माध्यम से) पर चलाकर एक 'दूरस्थ' भंडार बनाएँ ।

  2. कंप्यूटर 1 में, जैसा कि पहले दिखाया गया था।

    $ git remote add origin myserver.example.com:Gits/Large_Project.git
    

    या यदि आप पसंद करते हैं:

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. कंप्यूटर 2 में, फिर से विधि 1a के समान है।


विधि 2: आप 'ट्रांसफ़र बंडल' बना सकते हैं, जो किसी एकल फ़ाइल में दिए गए कमिट की सूची को संग्रहीत करता है।

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

  1. कंप्यूटर 1 में, पूरी शाखा का एक बंडल बनाएं:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. कंप्यूटर 2 में, बंडल से खींचें जैसे कि यह एक भंडार था:

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

बाद के बंडलों को पूरे पैक करने की आवश्यकता नहीं है master- वे last-bundled..masterइसके बजाय सिर्फ नए जोड़े गए कमिट को पैक कर सकते हैं ।

  1. कंप्यूटर 1 में, नए जोड़े गए कमिट का एक बंडल बनाएं:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. ऊपर की तरह।


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

manual tagging or note-keeping is needed, एक विकल्प जब तक कि रेपो बहुत बड़ा नहीं होता है:, git bundle create my.bundle --allइसमें सब कुछ होना चाहिए
पक्षी 10

मुझे यह उत्तर अधिक पसंद है क्योंकि स्वीकृत उत्तर के बावजूद यह अधिक निराशाजनक है और यह वही बात कहता है।
रिस्ट्रामम

"नंगे" विकल्प का क्या महत्व है?
ऑर्बिट

1
यह एक रिपॉजिटरी बनाता है जो सिर्फ डेटाबेस है (जो आप सामान्य रूप से .git/छिपे हुए फ़ोल्डर में पाएंगे ), बिना 'वर्किंग ट्री' (संपादन योग्य फाइलें) के। यह रिपॉजिटरी के लिए पसंदीदा फॉर्म है जिसे आप git pushकरना चाहते हैं।
ग्रैविटी

20

git bundle create

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

प्रत्येक "गिट पुश" एक फ़ाइल के निर्माण में बदल जाता है, "गिट फ़िश" उस फ़ाइल से चीजों को प्राप्त करता है।

डेमो सत्र

पहला रिपॉजिटरी बनाना और पहला "पुश" करना

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

दूसरी रिपॉजिटरी (यानी दूसरा कंप्यूटर) के लिए "क्लोनिंग":

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

कुछ बदलाव करते हुए उन्हें एक बंडल फाइल में "पुश" करें:

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

पहली रिपॉजिटरी में "पुलिंग" परिवर्तन:

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

पहले बंडल के विपरीत, दूसरे में केवल आंशिक गिट इतिहास शामिल है और यह सीधे क्लोन करने योग्य नहीं है:

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

बंडलों का उपयोग करने में नुकसान है कि आपको मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता है कि प्रत्येक बंडल में कौन सी सीमा होती है। इसके विपरीत git push, git bundleयह ट्रैक नहीं रखता है कि पिछली बंडल में क्या था, आपको मैन्युअल रूप से समायोजित करने की आवश्यकता है refs/remotes/origin/masterया बंडल से बड़ा हो सकता है।


--allसब कुछ पाने के लिए झंडे का उल्लेख करना न भूलें । अगर रेपो काफी छोटा है तो यह सबसे सरल प्रक्रिया है क्योंकि आप हर बार हर चीज को ट्रांसफर करते हैं! बस मेमोरी स्टिक ढीला न करें - शायद सबसे बड़ा सुरक्षा मुद्दा!
फिलिप ओकले

7

आपको पहले Git को इंस्टॉल करना होगा । फिर एक नया रिपॉजिटरी बनाने के लिए, उस फ़ोल्डर के भीतर चलाएं जिसे आपने कॉपी किया है:

git init

फिर आप उन फ़ाइलों को जोड़ सकते हैं, जिन्हें git addआप -aसभी नियंत्रणों में जोड़ना चाहते हैं ( सभी फ़ाइलों के लिए जोड़ें ) और परिवर्तनों को करना शुरू करें ( git commit)।

आपको किसी दूरस्थ पर धकेलने की आवश्यकता नहीं है, क्योंकि आप अपने स्थानीय इतिहास ( git log) पर काम कर सकते हैं ।

अधिक जानकारी के लिए, देखें:


इंटरनेट के बिना पुश / पुलिंग

git pushकमांड का उपयोग करना , SSH पर जोर देना संभव है (स्थानीय कनेक्शन, इंट्रानेट का उपयोग करके):

git remote add server ssh://[user@]host.xz[:port]/path/to/dev/repo.git/
git push server

या फ़ोल्डर में धक्का:

git push /mnt/usb/my_repo

यह मानता है कि आपने अपने भंडार की दो प्रतियां बनाई हैं।

पुलिंग के साथ भी ऐसा ही है

git pull /mnt/usb/my_repo

पैच

पैच लगाने के लिए, आप patchकमांड या का उपयोग कर सकते हैं git apply

देखें: गिट रिपॉजिटरी से पैच बनाएं या फाइल को अलग करें और इसे किसी अन्य भिन्न गिट रिपॉजिटरी में लागू करें


5

आप स्थानीय रूप से भी गिट का उपयोग कर सकते हैं। तब आपके कमिट केवल स्थानीय रूप से संग्रहीत होते हैं, और आपके पास अभी भी इसके साथ संस्करण नियंत्रण है (और भिन्न / मर्ज कर सकते हैं आदि), लेकिन आप किसी अन्य कंप्यूटर से रिपॉजिटरी तक नहीं पहुंच सकते।

आप git initअपने स्थानीय फ़ोल्डर में चलाकर स्थानीय Git रिपॉजिटरी शुरू कर सकते हैं । जैसा यहाँ बताया गया है


3
कि मुझे पता है, लेकिन मैं एक और कंप्यूटर पर काम करना चाहता हूं और इसे सर्वर पर फाइलों पर लागू करना चाहता हूं जिसमें कोई इंटरनेट एक्सेस नहीं है
टूटू काइन

2
@TutuKaeen मुझे फ्लैश ड्राइव पर रिपॉजिटरी के साथ कुछ भी गलत नहीं दिख रहा है और बस इसे अलग-अलग कंप्यूटर की हार्ड ड्राइव में क्लोनिंग / सिंक करना है। हालांकि, "इंटरनेट एक्सेस के बिना सर्वर" अजीब लगता है, एक सर्वर का लक्ष्य एक सेवा प्रदान करना है, सबसे अधिक बार सेवा नेटवर्किंग से संबंधित है (लेकिन हमेशा नहीं, वास्तव में)।
अनाम

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

2
@anonymousLurker सेवा बहुत महत्वपूर्ण संस्थान में बंद नेटवर्क को डेटा परोस रही है। यह सिर्फ व्यापक इंटरनेट के लिए कुछ भी नहीं करता है, क्योंकि डेटा बहुत नाजुक है और केवल कर्मचारियों के लिए है।
टूटू काइन

1
@TutuKaeen: यदि इसका कोई नेटवर्क एक्सेस है, तो आप हमेशा SSH के माध्यम से अपना स्वयं का Git सर्वर चला सकते हैं। GitHub की तुलना में Git में अधिक है।
विशालकाय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.