यह उत्तर वर्तमान में केवल दो लिनक्स कंप्यूटरों का उपयोग करने पर लागू होता है [या शायद मैक पर भी काम करता है? - मैक पर अनटाइटेड (एक से दूसरे में समन्वयित) क्योंकि मैंने इस सिंक्रनाइज़ेशन स्क्रिप्ट को बैश में लिखा था। यह बस के आसपास एक आवरण है git
, हालांकि, इसलिए इसे लेने के लिए स्वतंत्र महसूस करें और इसे एक क्रॉस-प्लेटफ़ॉर्म पायथन समाधान में बदलें या यदि आप चाहें तो
यह सीधे ओपी के सवाल का जवाब नहीं देता है, लेकिन यह इतना करीब है कि मैं गारंटी देता हूं कि यह कई अन्य लोगों के सवाल का जवाब देगा, जो इस पृष्ठ पर उतरते हैं (मेरा शामिल, वास्तव में, जैसा कि मैं अपना समाधान लिखने से पहले यहां आया था ), इसलिए मैं वैसे भी यहाँ पोस्ट कर रहा हूँ।
में चाहता हूं:
- लाइट-वेट लिनक्स कंप्यूटर पर ग्रहण जैसे शक्तिशाली आईडीई का उपयोग करके कोड विकसित करें
- एक अलग, अधिक शक्तिशाली लिनक्स कंप्यूटर (कमांड लाइन से, ग्रहण के अंदर से नहीं) पर ssh के माध्यम से उस कोड का निर्माण करें
आइए पहले कंप्यूटर को कॉल करें जहां मैं "PC1" (पर्सनल कंप्यूटर 1) कोड लिखता हूं, और दूसरा कंप्यूटर जहां मैं "PC2" कोड बनाता हूं। मुझे PC1 से PC2 तक आसानी से सिंक्रनाइज़ करने के लिए एक उपकरण की आवश्यकता है। मैंने कोशिश की rsync
, लेकिन यह बड़े रेपो के लिए बहुत धीमा था और टन और बैंडविड्थ और डेटा ले लिया।
तो मैं इसे कैसे करूं? मुझे कौन से वर्कफ़्लो का उपयोग करना चाहिए? यदि आपके पास भी यह सवाल है, तो यहां वर्कफ़्लो है जो मैंने तय किया है। मैंने स्वचालित git
रूप से दूरस्थ रिपॉजिटरी जैसे गीथब के माध्यम से PC1 से PC2 में परिवर्तन को स्वचालित रूप से पुश करने के लिए उपयोग करके प्रक्रिया को स्वचालित करने के लिए एक बैश स्क्रिप्ट लिखी । अब तक यह बहुत अच्छा काम करता है और मैं इससे बहुत खुश हूं। यह अब तक की तुलना में कहीं rsync
अधिक तेजी से , मेरी राय में अधिक भरोसेमंद है क्योंकि प्रत्येक पीसी एक कार्यात्मक गिट रेपो को बनाए रखता है, और पूरे सिंक को करने के लिए बहुत कम बैंडविड्थ का उपयोग करता है, इसलिए यह आपके डेटा के टन का उपयोग किए बिना सेल फोन के हॉट स्पॉट पर आसानी से संभव है।
सेट अप:
PC1 पर स्क्रिप्ट स्थापित करें (यह समाधान मानता है / बिन आपके $ पेट में है):
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -s "${PWD}/sync_git_repo_from_pc1_to_pc2.sh" ~/bin/sync_git_repo_from_pc1_to_pc2
cd ..
cp -i .sync_git_repo ~/.sync_git_repo
अब आपके द्वारा ऊपर कॉपी की गई "~ / .sync_git_repo" फ़ाइल को संपादित करें, और अपने मामले को फिट करने के लिए इसके मापदंडों को अपडेट करें। यहाँ ये पैरामीटर हैं:
# The git repo root directory on PC2 where you are syncing your files TO; this dir must *already exist*
# and you must have *already `git clone`d* a copy of your git repo into it!
# - Do NOT use variables such as `$HOME`. Be explicit instead. This is because the variable expansion will
# happen on the local machine when what we need is the variable expansion from the remote machine. Being
# explicit instead just avoids this problem.
PC2_GIT_REPO_TARGET_DIR="/home/gabriel/dev/eRCaGuy_dotfiles" # explicitly type this out; don't use variables
PC2_SSH_USERNAME="my_username" # explicitly type this out; don't use variables
PC2_SSH_HOST="my_hostname" # explicitly type this out; don't use variables
अपने रेपो क्लोन को गैट करें जिसे आप पीसी 1 और पीसी 2 दोनों पर सिंक करना चाहते हैं।
- सुनिश्चित करें कि आपकी ssh कुंजियाँ सभी PC1 और PC2 से दूरस्थ रेपो में धकेलने और खींचने में सक्षम हों। यहाँ कुछ उपयोगी लिंक दिए गए हैं:
- https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
- https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
- सुनिश्चित करें कि आपकी ssh कुंजियाँ PC1 से PC2 तक ssh पर सेट हैं।
अब cd
PC1 पर git रेपो के भीतर किसी भी डायरेक्टरी में, और रन करें:
sync_git_repo_from_pc1_to_pc2
बस! लगभग 30 सेकंड बाद सब कुछ जादुई रूप से पीसी 1 से पीसी 2 तक सिंक हो जाएगा, और यह आपको यह बताने के लिए पूरे समय का आउटपुट प्रिंट करेगा कि यह क्या कर रहा है और यह आपकी डिस्क पर और किस कंप्यूटर पर कर रहा है। यह सुरक्षित भी है, क्योंकि यह ऐसी किसी भी चीज़ को अधिलेखित या हटाना नहीं है, जो अनधिकृत है। यह बजाय पहले इसे वापस कर देता है! यह कैसे काम करता है इसके लिए नीचे पढ़ें।
इस प्रक्रिया का उपयोग इस प्रक्रिया में किया गया है (यानी: यह वास्तव में क्या कर रहा है)
- PC1 से: यह देखने के लिए जाँचता है कि क्या PC1 पर कोई भी अनपेक्षित परिवर्तन हैं या नहीं। यदि हां, तो यह उन्हें वर्तमान शाखा पर एक अस्थायी प्रतिबद्धता के लिए प्रतिबद्ध करता है। इसके बाद बल उन्हें एक दूरस्थ SYNC शाखा में धकेल देता है। फिर यह अपनी अस्थायी प्रतिबद्ध को अनचाही कर देता है, यह सिर्फ स्थानीय शाखा पर किया गया है, फिर यह स्थानीय गिट रेपो को वापस ठीक उसी तरह से रखता है जैसे कि यह उस समय किसी भी फाइल को मंचित करके किया गया था, जिसे पहले स्क्रिप्ट कहा जाता था। इसके बाद, यह
rsync
PC2 पर स्क्रिप्ट की एक प्रति है, और ssh
PC2 सामान करने के लिए एक विशेष विकल्प के साथ स्क्रिप्ट को चलाने के लिए PC2 को बताने के लिए एक कॉल करता है ।
- यहाँ PC2 क्या करता है: यह
cd
रेपो में है, और यह देखने के लिए जाँचता है कि क्या कोई स्थानीय परिवर्तन मौजूद नहीं है। यदि ऐसा है, तो यह वर्तमान शाखा (नमूना नाम: my_branch_SYNC_BAK_20200220-0028hrs-15sec
<- ध्यान दें कि YYYYMMDD-HHMMhrs - SSsec) से दूर की गई एक नई बैकअप शाखा बनाता है , और उस शाखा में किसी भी तरह के परिवर्तन नहीं करता है जो प्रतिबद्ध संदेश के साथ होता है जैसे DO BACKUP OF ALL। PC2 पर अनर्जित परिवर्तन (लक्ष्य पीसी / भवन मशीन)। अब, यह SYNC शाखा की जाँच करता है, इसे दूरस्थ रिपॉजिटरी से खींचता है अगर यह पहले से ही स्थानीय मशीन पर नहीं है। फिर, यह दूरस्थ रिपॉजिटरी पर नवीनतम परिवर्तन लाता है, और स्थानीय SYNC रिपॉजिटरी को दूरस्थ SYNC रिपॉजिटरी से मेल खाने के लिए मजबूर करने के लिए एक हार्ड रीसेट करता है। आप इसे "हार्ड पुल" कह सकते हैं। हालाँकि, यह सुरक्षित है, क्योंकि हमने पहले से ही पीसी 2 पर स्थानीय स्तर पर किसी भी तरह के परिवर्तन नहीं किए हैं, इसलिए कुछ भी नहीं खोया है!
- बस! अब आपने साफ-सुथरी वर्किंग डायरेक्टरी सुनिश्चित करने के लिए PC1 से PC2 तक की एक परफेक्ट कॉपी तैयार कर ली है, क्योंकि स्क्रिप्ट ने आपके लिए ऑटोमैटिक कमिटिंग और स्टफ को संभाल लिया है! यह तेज़ है और विशाल रिपॉजिटरी पर बहुत अच्छा काम करता है। अब आपके पास किसी भी मशीन पर अपनी पसंद की किसी भी आईडीई का उपयोग करने के लिए एक आसान तंत्र है, किसी अन्य मशीन का निर्माण या परीक्षण करते समय, आसानी से, अपने सेल फोन से एक वाईफाई हॉट स्पॉट पर, यदि आवश्यक हो, भले ही रिपॉजिटरी दर्जनों गीगाबाइट का हो और आपके पास समय हो और संसाधन-विवश।
संसाधन:
- पूरी परियोजना: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
- स्रोत कोड में ही इस परियोजना के भीतर टन और लिंक और संदर्भ देखें।
- "हार्ड पुल" कैसे करें, जैसा कि मैं इसे कहता हूं: मैं स्थानीय फ़ाइलों को अधिलेखित करने के लिए "गिट पुल" को कैसे मजबूर कर सकता हूं?
सम्बंधित:
- कंप्यूटर के बीच git रिपॉजिटरी सिंक, जब घूम रहा हो?