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


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


83
2017-10-17 11:39


मूल


आपका शीर्षक कोई नेटवर्क एक्सेस नहीं कहता है, आपका प्रश्न इंटरनेट का उपयोग नहीं करता है; एक बड़ा अंतर - tkausl
@TutuKaeen आप एक स्थानीय नेटवर्क हो सकता है जो इंटरनेट से कनेक्ट नहीं है। तो इसके बजाय github.com उदाहरण के लिए आपने गिट सर्वर सेट अप किया है। 192.168.1.100 और बाकी सब कुछ समान काम करता है। - Agent_L
@TutuKaeen: महत्वपूर्ण सवाल यह है कि क्या दो मशीनों के बीच प्रत्यक्ष (या अप्रत्यक्ष) नेटवर्क संचार संभव है। तो आपके मामले में, दोनों मशीनें नेटवर्क की जाती हैं, लेकिन नेटवर्क अलग हो जाते हैं? उस स्थिति में, कृपया उस जानकारी को अपने प्रश्न में संपादित करें। - sleske
@TutuKaeen आपका प्रश्न अस्पष्ट बनी हुई है। आप कहते हैं कि आप संस्करण नियंत्रण का उपयोग करना चाहते हैं, लेकिन आपकी टिप्पणियों में आपको यह आवश्यक है कि यह आपको उत्पादन में तैनात करने में मदद करे। ये मुद्दे हमेशा ओवरलैप नहीं होते हैं। मुझे लगता है कि अब आपके पास अच्छे जवाब हैं, लेकिन भविष्य में यह उपयोगी होगा यदि आपका प्रश्न आपकी आवश्यकताओं के बारे में अधिक व्यापक था, जो ऐसा लगता है: "मैं संस्करण नियंत्रण का उपयोग करना चाहता हूं, मेरी विकास मशीन में इंटरनेट का उपयोग नहीं है, इसमें नेटवर्क एक्सेस है लेकिन उत्पादन मशीन पर नहीं है, और मैं जानना चाहता हूं कि उत्पादन मशीन पर संस्करण नियंत्रण से कोड कैसे प्राप्त करें। " - DavidS
यह शब्द का उपयोग करने के लिए अजीब लगता है server मशीन के लिए किसी भी नेटवर्क से कनेक्ट नहीं है। यह इंटरनेट एक्सेस के बिना भी एक स्थानीय नेटवर्क हो सकता है लेकिन फिर भी यह एक नेटवर्क है। - uom-pgregorio


जवाब:


निश्चित रूप से, गिट के बारे में कुछ भी नहीं है जिसके लिए एक विशेष प्रोटोकॉल की आवश्यकता है। बस बॉक्स से बाहर मानक ग्राहक का समर्थन करता है HTTP (एस), एसएसएच, कस्टम गिट प्रोटोकॉल और, महत्वपूर्ण रूप से, स्थानीय मसविदा बनाना। यह सिर्फ एक स्थानीय के लिए एक रास्ता लेता है .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:// प्रोटोकॉल तो गिट कुछ मानक नेटवर्क घटकों (स्थानीय डिस्क से बात करने के लिए) का उपयोग करेगा, जो धीमा है।


155
2017-10-17 12:24



इस असाधारण उत्तर में जोड़ने के लिए - फ्लैश ड्राइव पर 'नंगे' रेसॉजिटरी का उपयोग करके जांच करना भी उपयोगी हो सकता है। 'नंगे' भंडारों में एक काम करने वाला पेड़ नहीं है, और इसलिए साझा किए गए 'प्वाइंट ऑफ अथॉरिटी' के रूप में उपयोग किए जाने पर संभावित मुद्दों की एक श्रेणी काट लें, जो ओपी के उपयोग-मामले की तरह लगता है। - Iron Gremlin
file:// थोड़ा और अधिक लचीला है। यह आपको कुछ विशेषताओं (जैसे उथले क्लोन) का उपयोग करने की अनुमति देता है जिन्हें आप स्थानीय पथ से नहीं कर सकते हैं। - Austin Hemmelgarn
@IronGremlin क्या आप इस "साझा बिंदु के अधिकार" धारणा पर विस्तार कर सकते हैं? मैं एक गिट विशेषज्ञ नहीं हूं और मैं उत्सुक हूं कि इसका मतलब क्या है। - Lightness Races in Orbit
@LightnessRacesinOrbit - यह एक सुंदर घना विषय है, लेकिन, मूल रूप से, गिट वितरित किया जाता है, इसलिए हर कोई अपना इतिहास प्राप्त करता है। ए इतिहास के अपने संस्करण के लिए बी से पूछ सकता है, लेकिन सी इसके बारे में तब तक नहीं जानता जब तक कि कोई उन्हें नहीं बताता। 'आधिकारिक' इतिहास को स्टोर करने के लिए एक ही भंडार होने का अर्थ है डी इतिहास के लिए एक समाशोधन घर के रूप में कार्य करता है। तो, ए परिवर्तनों के बारे में डी को बताता है, और बी और सी डी के साथ साइड-चैनल सामान करने के बजाए अद्यतित रहने के लिए डी से बात करना जानते हैं। मामले में, यदि ओपी का सर्वर सी है, और फ्लैश ड्राइव डी है, तो यह सुनिश्चित करता है कि सर्वर ए / बी इंटरैक्शन से बाहर नहीं निकलता है। - Iron Gremlin
@LightnessRacesinOrbit यहां ध्यान देने योग्य महत्वपूर्ण है कि नंगे को आधिकारिक का मतलब नहीं है, यह उस संदर्भ में बस उपयोगी है। उदाहरण के लिए, यह भी उपयोगी है क्योंकि, एक काम करने वाले पेड़ की कमी, यह एक छोटा डिस्कस्पेस (या बैंडविड्थ) पदचिह्न है। यह अब से कहीं अधिक महत्वपूर्ण है, लेकिन अभी भी ऊपर आता है। - Iron Gremlin


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

एक भंडार को सिंक्रनाइज़ करने के लिए विभिन्न कंप्यूटर, कई विधियां हैं।

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

  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
    

(आप सीधे यूआरएल या पथ से धक्का / खींच सकते हैं / खींच सकते हैं।)

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

  1. चलकर 'रिमोट' रिपॉजिटरी बनाएं git init --bare <somepath.git> निर्दिष्ट सर्वर पर (एसएसएच के माध्यम से)।

  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 में, फिर विधि 1 ए के समान ही।


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

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

  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. ऊपर की तरह।


46
2017-10-17 12:21



असल में यह मेरे उद्देश्यों के लिए बुरा नहीं होगा, गिट में भी कुछ भी "प्राथमिक" नहीं है क्योंकि प्रत्येक भंडार का पूरा इतिहास होता है, इसलिए जब भी कुछ बुरा हो जाता है तो आप इसे फिर से बना सकते हैं - Tutu Kaeen
manual tagging or note-keeping is needed, एक विकल्प जब तक रेपो बहुत बड़ा नहीं है: git bundle create my.bundle --all, इसमें सबकुछ होना चाहिए - birdspider
मुझे यह उत्तर अधिक पसंद है क्योंकि यह स्वीकार्य उत्तर के बावजूद अधिक चित्रकारी है और यह वही बात कहता है। - Rystraum
"नंगे" विकल्प का महत्व क्या है? - Lightness Races in Orbit
यह एक भंडार बनाता है जो है केवल डेटाबेस (जो आपको सामान्य रूप से मिलते हैं .git/ छुपा फ़ोल्डर), बिना 'काम करने वाले पेड़' (संपादन योग्य फाइलें)। यह भंडारों के लिए यह पसंदीदा रूप है git pushसेवा मेरे। - grawity


git bundle create

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

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

डेमो सत्र

पहला भंडार बनाना और पहला "पुश" करना

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 या बंडल जितना बड़ा हो सकता है उससे बड़ा होगा।


21
2017-10-17 15:33



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


आपको पहले स्थापित करना होगा Git। फिर एक नया भंडार बनाने के लिए, आपके द्वारा प्रतिलिपि किए गए फ़ोल्डर में चलाएं:

git init

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

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

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


इंटरनेट के बिना धक्का / खींचना

का उपयोग करते हुए git push आदेश, एसएसएच पर धक्का देना संभव है (स्थानीय कनेक्शन, इंट्रानेट का उपयोग करके):

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

देख: गिट भंडार से पैच या diff फ़ाइल बनाएँ और इसे एक और अलग गिट भंडार पर लागू करें


7
2017-10-17 12:09





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

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


5
2017-10-17 11:43



जो मुझे पता है, लेकिन मैं किसी अन्य कंप्यूटर पर काम करना चाहता हूं और इसे बिना किसी इंटरनेट एक्सेस के सर्वर पर फ़ाइलों पर लागू करना चाहता हूं - Tutu Kaeen
@TutuKaeen मुझे फ्लैश ड्राइव पर रिपोजिटरी रखने और कुछ अलग-अलग कंप्यूटरों की हार्ड ड्राइव पर क्लोनिंग / सिंक करने के साथ कुछ भी गलत नहीं लगता है। हालांकि, "इंटरनेट एक्सेस के बिना सर्वर" अजीब लगता है, सर्वर का लक्ष्य एक सेवा प्रदान करना है, अक्सर सेवा नेटवर्किंग से संबंधित होती है (लेकिन हमेशा नहीं, वास्तव में)। - AnonymousLurker
@dha - कृपया स्थानीय रूप से गिट का उपयोग करने के तरीके के बारे में अधिक जानकारी प्रदान करने के लिए एक पल लें। केवल यह इंगित करना कि यह किया जा सकता है वह उत्तर के सहायक नहीं है। - Ramhound
@anonymousLurker सेवा बहुत महत्वपूर्ण संस्थान में बंद नेटवर्क पर डेटा की सेवा कर रहा है। यह सिर्फ व्यापक इंटरनेट पर कुछ भी नहीं करता है, क्योंकि डेटा बहुत नाजुक है और केवल कर्मचारियों के लिए है। - Tutu Kaeen
@TutuKaeen: अगर यह है कोई भी नेटवर्क एक्सेस, आप हमेशा एसएसएच के माध्यम से अपना खुद का गिट सर्वर चला सकते हैं। गिटहब की तुलना में गिट के लिए और भी कुछ है। - grawity