कंप्यूटर के बीच git रिपॉजिटरी सिंक, जब घूम रहा हो?


89

मान लीजिए कि मेरे पास एक डेस्कटॉप पीसी और एक लैपटॉप है, और कभी-कभी मैं डेस्कटॉप पर काम करता हूं और कभी-कभी मैं लैपटॉप पर काम करता हूं।

गिट रिपॉजिटरी को आगे और पीछे ले जाने का सबसे आसान तरीका क्या है?

मैं चाहता हूं कि git रिपॉजिटरी समान हो, ताकि मैं दूसरे कंप्यूटर पर जहां मैंने छोड़ा है उसे जारी रख सकूं।

मैं यह सुनिश्चित करना चाहूंगा कि दोनों कंप्यूटरों पर मेरी एक ही शाखाएं और टैग हैं।

धन्यवाद जोहान

नोट: मुझे पता है कि यह सब-वर्जन के साथ कैसे किया जाता है, लेकिन मैं उत्सुक हूं कि यह कैसे काम करेगा। यदि यह आसान है, तो मैं तीसरे पीसी को शास्त्रीय सर्वर के रूप में उपयोग कर सकता हूं जो दो पीसी: एस के खिलाफ सिंक कर सकता है।

नोट: दोनों कंप्यूटर लिनक्स चला रहे हैं।


अपडेट :

तो चलिए XANI का प्रयास करते हैं: एक सर्वर पर एक नंगे गिट रेपो के साथ विचार, और KingCrunch से पुश कमांड सिंटैक्स। इस उदाहरण में दो क्लाइंट और एक सर्वर है।

तो चलिए सबसे पहले सर्वर पार्ट बनाते हैं।

ssh user@server
mkdir -p ~/git_test/workspace
cd ~/git_test/workspace
git --bare init

तो फिर अन्य कंप्यूटरों में से एक मैं क्लोन के साथ रेपो की एक प्रति प्राप्त करने की कोशिश करता हूं:

git clone user@server:~/git_test/workspace/
Initialized empty Git repository in /home/user/git_test/repo1/workspace/.git/
warning: You appear to have cloned an empty repository.

फिर उस रेपो में जाएं और एक फाइल जोड़ें:

cd workspace/
echo "test1" > testfile1.txt
git add testfile1.txt
git commit testfile1.txt -m "Added file testfile1.txt"
git push origin master

अब सर्वर testfile1.txt के साथ अपडेट किया गया है।

वैसे भी, देखते हैं कि क्या हम इस फाइल को दूसरे कंप्यूटर से प्राप्त कर सकते हैं।

mkdir -p ~/git_test/repo2
cd ~/git_test/repo2
git clone user@server:~/git_test/workspace/
cd workspace/
git pull

और अब हम वृषण को देख सकते हैं।

इस बिंदु पर हम इसे कुछ और सामग्री के साथ संपादित कर सकते हैं और सर्वर को फिर से अपडेट कर सकते हैं।

echo "test2" >> testfile1.txt
git add testfile1.txt
git commit -m "Test2"
git push origin master

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


सिंक स्क्रिप्ट का उपयोग करने की प्रक्रिया को स्वचालित रूप से पीसी 1 से पीसी 2 तक सिंक करने के लिए और कम डेटा उपयोग के साथ, यहां तक ​​कि एक सेल फोन वाईफाई हॉटस्पॉट पर (इस उपयोग के मामले के लिए rsync की तुलना में सैकड़ों गुना तेज है!): Stackover.com/questions
गेब्रियल स्टेपल्स

जवाबों:


27

मुझे लगता है, कई दृष्टिकोण हैं। मैं सिर्फ यह बताऊंगा कि मैं इसे कैसे संभालता हूं

मेरे पास 24/7 सर्वर के रूप में एक नेटबुक है, जिसमें कई गिट-रिपॉजिटरी हैं। SSH के माध्यम से / वहां से मैं परिवर्तनों को धक्का देता हूं और खींचता हूं। बाहर से पहुंच के लिए मैं dyndns.org का उपयोग करता हूं। यह ठीक काम करता है, खासकर क्योंकि मेरे पास दो से अधिक सिस्टम हैं, जिनमें से कुछ रिपॉजिटरी तक पहुंच की आवश्यकता है।

अद्यतन: एक छोटा सा उदाहरण। आइए कहते हैं कि मेरी नेटबुक को "नेटबुक" कहा जाता है। मैं वहां एक भंडार बनाता हूं

$ ssh username@netbook.local
$ cd ~/git
$ mkdir newThing
$ cd newThing
$ git init --bare

अपने डेस्कटॉप पर मैं इसका एक क्लोन बनाऊंगा। शायद मैं कुछ फाइलें भी जोड़ूंगा

$ git clone username@netbook.local:/home/username/git/newThing
$ git add .
$ git commit -m "Initial"
$ git push origin master

अपने पोर्टेबल्स पर मैं (पहले) ऐसा ही करूंगा, लेकिन रिमोट एक्सेस (अपने लैन के बाहर से) के लिए, मैं बाहरी पता भी जोड़ूंगा।

$ git clone username@netbook.local:/home/username/git/newThing
$ git remote add externalName username@mydyndns.home-ip.org:/home/username/git/newThing
$ git pull externalName master

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

$ mkdir myRepo; cd myRepo
$ git init --bare
$ cd /path/to/myProject
$ git remote add origin /path/to/myRepo
$ git add .; git commit -m "Initial"; git push origin master

यह तरीका है, मैं इसे कैसे संभालता हूं, और मेरे लिए यह काफी ठीक काम करता है (यदि सही नहीं है;);

कुछ पढ़ने के लिए: http://progit.org/ वास्तव में अच्छी किताब ।-


जब आप रेपो में विभिन्न तरीकों का उपयोग करते हैं, तो यह कैसा दिखेगा? क्या आप एक उदाहरण के साथ अपने उत्तर को स्पष्ट करना चाहेंगे?
जोहान

धन्यवाद, उन उदाहरणों ने बहुत कुछ स्पष्ट किया :)
जोहान

6

मैं एक बॉक्स से दूसरे में रेपो को क्लोन करूँगा, और फिर दो रिपोज़ सेट करूँगा ताकि मैं बस कर सकूँ git fetch दूसरे बॉक्स से ।

originदूसरे बॉक्स के नाम से रिमोट का नाम बदलने से दूरस्थ शाखाओं को पढ़ने में आसानी होती है।

ध्यान दें कि सिर्फ git fetch(और नहीं git push) का उपयोग करके , यह गैर-नंगे भंडार के साथ अच्छी तरह से काम करता है:

[user@foo repo]$ git fetch -v bar

[user@bar repo]$ git fetch -v foo

5

सबसे आसान तरीका: केंद्रीय रेपो के साथ बनाया गया --bare(ताकि कोई चेक आउट फ़ाइलें, केवल .गित सामान), या गितूब

"वितरित" ऐसा दिखेगा:

सेट अप:

  1. लैपटॉप पर: git remote add desktop ssh://user@desktop/home/user/repo/path
  2. डेस्कटॉप पर: git remote add laptop ssh://user@laptop/home/user/repo/path

सिंक कर रहा है:

git pull laptop/desktop (नॉन-नंगे रेपो पर पुश बहुत अच्छा काम नहीं करेगा क्योंकि git रिमोट रेपो पर पुश करते समय चेक आउट फ़ाइलों को संशोधित नहीं करेगा)

या, पेनड्राइव पर रेपो बनाएं;)


मैंने एक -bare रेपो का उपयोग करने की कोशिश की, लेकिन मुझे संपूर्ण वर्कफ़्लो सही नहीं मिल रहा है।
जोहान

मैं सिर्फ git से शुरुआत कर रहा हूं, और gitub और स्थानीय git से वापस जा रहा हूं और अब तक मैं ऐसा कर सकता हूं, लेकिन कंप्यूटर-से-कंप्यूटर विधि मैं काम नहीं कर सकता। गूंगा सवाल - मैं किन क्रेडेंशियल्स का उपयोग करता हूं user? गितुब के लिए, मुझे बस rsa-pub कुंजियाँ जोड़ना हैं। मैंने क्लोन आवश्यकताकर्ता कंप्यूटर के लिए ज्ञात_होस्ट में rsa-pub जोड़ने की कोशिश की है, लेकिन यह चाल नहीं चली ...
डेव

लगातार रिमोट सर्वर से टकराने के बिना दो स्थानीय मशीनों के बीच सिंक करना मेरे लिए सबसे आसान तरीका है।
जॉनजचारी

1

कैसे के बारे में बस का उपयोग rsync?


3
मैंने तीन सर्वरों को समन्वयित रखने के लिए वर्षों से rsync का उपयोग किया है। यह काम करता है लेकिन rsync आपको सिंक को पूरा करने के बाद परिवर्तनों को वापस करने का एक तरीका नहीं देता है। मैंने इस तरह से बहुत सारी फाइलें खो दी हैं क्योंकि मैंने ड्राई-रन आउटपुट को पर्याप्त रूप से नहीं पढ़ा है और मास्टर पर मौजूद फ़ाइलों को हटाने के लिए rsync सेट किया गया था। मैं तब से जीआईटी में चला गया हूं और महत्वपूर्ण निर्देशिकाओं को सिंक में रखने के लिए इसे बहुत सुरक्षित तरीका है।
क्लाउडकीलर

1

क्या आप सिर्फ GitHub, BitBucket या GitLab पर रिमोट रिपॉजिटरी नहीं बना सकते हैं? (बाद की दो कंपनियां असीमित मुफ्त निजी रिपॉजिटरी की पेशकश करती हैं)। जब आप काम पर दिन खत्म करते हैं, तो बस git pushअपने परिवर्तनों को दूरस्थ रेपो में धकेलने के लिए उपयोग करें। जब आप घर जाते हैं, तो बस git pullअपने घर की मशीन पर काम से अपने परिवर्तनों को खींचने के लिए करते हैं। इसी तरह, जब आप घर पर खत्म करते हैं, git pushतब करते हैं और जब आप काम पर लौटते हैं, तब करते हैं git pull


1

गिट रिपॉजिटरी को आगे-पीछे करने का सबसे आसान तरीका क्या है [2 कंप्यूटरों के बीच]?

परिदृश्य 1: मैं PC1 पर विशेष रूप से (कोड और फ़ाइलों को संपादित करता हूं) काम करता हूं, लेकिन पीसी 2 पर (संपूर्ण कोड आधार बनाने के लिए): फाइलों की एक डुप्लीकेट कॉपी (उदा: संपूर्ण कोड आधार बनाने के लिए) चाहता हूं।

एक 25 मिनट डेटा का उपयोग करते हुए एक वाईफाई हॉटस्पॉट पर <1 मिनट में पीसी 1 से पीसी 2 तक सिंक करें:

मैं एक कमजोर कंप्यूटर पर काम करता हूं जिसके साथ मैं (एक लैपटॉप) यात्रा करता हूं, लेकिन कहीं और स्थित शक्तिशाली कंप्यूटर पर निर्माण करता हूं। मैं एक स्क्रिप्ट का उपयोग करके अपने लैपटॉप से ​​दूसरे कंप्यूटर पर सिंक करने के लिए हर समय गिट का उपयोग करता हूं। मैं इसे चलाने के लिए सिर्फ यह कमांड टाइप करता हूं:

sync_git_repo_from_pc1_to_pc2

बस! यह आमतौर पर लगभग 25 एमबी डेटा और ~ 30 सेकंड से 1 मिनट तक लेता है, यहां तक ​​कि सेल फोन वाईफाई हॉटस्पॉट का उपयोग करते समय और एक रेपो पर काम करना होता है जो आकार में दर्जनों गीगाबाइट होता है। मैं PC2 में ssh'ed हूं, इसलिए मैं यह git log -1पुष्टि करने के लिए PC2 पर करता हूं कि सिंक ने काम किया है, फिर मैं बिल्ड कमांड चलाता हूं। अच्छी तरह से काम। इसे आजमा कर देखें। विवरण के लिए नीचे दिए गए लिंक देखें।

नोट: PC2 पर क्लोन किया गया रेपो नाम की एक git शाखा पर होगा somename_SYNC। स्क्रिप्ट को उचित रूप से संशोधित करें यदि आप चाहते हैं कि हमेशा "SYNC शाखा" का उपयोग करने के बजाय उसी शाखा का नाम हो। यदि वांछित है तो नीचे दिए गए परिदृश्य 2 जैसे प्रभाव को प्राप्त करने के लिए स्क्रिप्ट को संशोधित करना संभव है। फिर भी, परिदृश्य 2 मैन्युअल रूप से करना कठिन नहीं है, इसलिए आप केवल परिदृश्य 2 मैन्युअल रूप से जारी रखना चाहते हैं। यह परिदृश्य 1 है जहां स्वचालित स्क्रिप्ट सबसे अधिक फायदेमंद और समय की बचत है, क्योंकि यह एक आसान और तेजी से "संशोधित, सिंक, बिल्ड" वर्कफ़्लो की अनुमति देता है जहां पीसी 1 पर "संशोधित" होता है, पीसी 1 से "सिंक" चलता है, लेकिन यह भी प्रभावित करता है PC2, और "निर्माण" PC2 पर होता है।

लिंक:

  1. पूर्ण सेटअप और स्थापना निर्देश यहाँ: SSH के माध्यम से ग्रहण के साथ एक दूरस्थ परियोजना पर काम करें
  2. यहाँ पढ़ें, प्रलेखन, और रेपो: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/README_git-sync_repo_from_pc1_to_pc2.md
  3. प्रश्न में सटीक स्क्रिप्ट यहां है:
    https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/sync_git_repo_from_pc1_to_pc2.sh

परिदृश्य 2: मैं कई कंप्यूटरों पर काम करता हूं (कोड और फ़ाइलों को संपादित करता हूं), और दुनिया के किसी भी कंप्यूटर से समान कोड भंडार को संपादित करने में सक्षम होना चाहता हूं:

मैं चाहता हूं कि git रिपॉजिटरी समान हो, ताकि मैं दूसरे कंप्यूटर पर जहां मैं रह गया हूं उसे जारी रख सकूं। मैं यह सुनिश्चित करना चाहूंगा कि दोनों कंप्यूटरों पर मेरी एक ही शाखाएं और टैग हैं।

  1. Https://github.com पर जाएं और एक खाता बनाएं और वैकल्पिक रूप से (अनुशंसित) ssh कुंजी सेट करें

  2. अब एक नया भंडार बनाने के लिए उनके वेब इंटरफेस का उपयोग करें।

    1. वर्ष 2020 तक या उससे पहले, GitHub मुफ्त निजी रिपॉजिटरी को भी अनुमति देता है, इसलिए यह निजी, बंद-स्रोत परियोजनाओं के लिए भी अच्छी तरह से काम करता है।
  3. नया रिपॉजिटरी ssh या https क्लोन URL खोजें। Ex: git@github.com: ElectricRCAircraftGuy / eRCaGuy_dotfiles.git या https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git

  4. PC1 पर प्रोजेक्ट को क्लोन करें। उदाहरण के लिए:

     git@github.com:ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
     cd eRCaGuy_dotfiles
    
  5. और PC2 पर वही सटीक क्लोन कमांड दोहराएं।

  6. अब PC1 पर, कुछ बदलाव करें, उन्हें कमिट करें और उन्हें अपने "रिमोट" रिपॉजिटरी में github पर धकेलें:

     # edit some files, then do the following
     git add -A  # stage ("add") all changed files to be committed 
     git commit  # commit them
     git push    # push them to your remote github repo
    
  7. अब PC2 पर, अपने परिवर्तनों में शामिल हों:

     # pull all changes from github (which includes the changes
     # you just pushed from PC1) to PC2
     git pull  
    
  8. अब आप PC2 पर फ़ाइलों को संपादित कर सकते हैं, उन्हें कमिट कर सकते हैं, और उन्हें केवल 2 कदम ऊपर दिखाए गए कमांड्स का उपयोग करके उन्हें आगे बढ़ाने के लिए धक्का दे सकते हैं, और फिर PC1 से आप git pullPC2 से उन परिवर्तनों को खींचने के लिए चला सकते हैं ।

  9. आवश्यकतानुसार इस प्रक्रिया को करते रहें, PC1 या PC2 पर काम करना, और आसानी से फाइलों को साझा करना और दो कंप्यूटरों के बीच अपने काम को विभाजित करना। बस याद रखें कि आपके सभी परिवर्तनों को प्रतिबद्ध होना चाहिए और उन्हें एक पीसी पर गिथब करने के लिए धकेल दिया जाना चाहिए, इससे पहले कि आप उन्हें चेक कर सकें (उन्हें खींच लें) और दूसरे पीसी पर काम करना जारी रखें।

  10. यदि आप कभी ऐसी स्थिति में आते हैं जहाँ दो पीसी के बीच फाइलें थोड़ी-सी बाहर होती हैं, तो आपको कुछ अतिरिक्त शाखाओं का उपयोग करना होगा, कुछ मर्ज करना होगा, विवादों को सुलझाना होगा आदि, फिर यह काम करने के समान हो जाता है। एक छोटी सी टीम के साथ जहां आप सभी एक ही रेपो पर काम कर रहे हैं। Google आपका मित्र है Git बहुत बहुत शक्तिशाली है, और इसमें कमांड, सेट्स, या वर्कफ़्लो के बारे में सब कुछ है।


0

ठीक है, आप जिस सर्वर को संभावित रूप से सेट कर सकते हैं, उसे (Git के माध्यम से) पुश और खींच सकते हैं। या आप GitHub में अपने रेपो को स्टोर कर सकते हैं और एक सिंकिंग ब्रिज के रूप में उपयोग कर सकते हैं।


0

आप अपने किसी भी कंप्यूटर पर रिपॉजिटरी बना सकते हैं, शायद डेस्कटॉप एक और लैपटॉप और स्वयं दोनों से इसे पुश / पुल करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.