गिट रिपॉजिटरी में कई प्रोजेक्ट लगाने के लिए सबसे अच्छा अभ्यास क्या है? [बन्द है]


188

किसी कारण के रूप में, मेरे पास उपयोग करने के लिए केवल एक भंडार है।
लेकिन मेरे पास कई प्रोजेक्ट हैं java, जिनमें प्रोजेक्ट्स php scriptsऔर Androidऐप प्रोजेक्ट्स भी शामिल हैं।

अब मेरी समस्या है, मैं उन्हें अलग करने के लिए डाल करने के लिए है उप फ़ोल्डरों भंडार के अंदर
मैं अलग IDEs उपयोग करते हैं, तुम्हें पता है, प्रत्येक आईडीई ही एक कार्यक्षेत्र हो सकता है।

समस्या को हल करने के लिए मुझे सबसे अच्छा अभ्यास कौन बता सकता है?


1
एक संभावित समाधान stackoverflow.com/questions/5514739/… या stackoverflow.com/a/7931825/828197
Ragnarokr

2
तुम अकेले नहीं हो। मेरे पास अपने रेपो के साथ ऐसा ही मामला है जिसे मैं सीखने के उद्देश्यों के लिए उपयोग करता हूं (उदाहरण: github.com/hopbit/java-sandbox )। मैं हर नई किताब / ट्यूटोरियल के लिए उदाहरणों को पढ़ने के लिए नया रेपो बनाना नहीं चाहता हूं ...
zukasz Siwi'ski

ऐसा करने का एक कारण यह है कि यदि आपको एक ऐसा उत्पाद मिल गया है, जो उत्पाद कोड है, जिसे आप परीक्षण या उत्पादन जैसे रनटाइम वातावरण में वितरित करते हैं। दूसरा प्रोजेक्ट एक एप्लीकेशन है जो सिस्टम टेस्ट (उदाहरण के लिए BDD) है। इन दो परियोजनाओं के बीच एक संबंध है और अब आप एक रिपॉजिटरी यूआरएल का उपयोग करके संपूर्णता को बनाए रख सकते हैं / संदर्भित कर सकते हैं।
लांस काइंड

नीचे दिए गए सारांश के अनुसार "Git का कोई पता नहीं है कि क्या ये समान या अलग-अलग परियोजनाओं के भाग हैं"
ahmednabil88

जवाबों:


198

जबकि अधिकांश लोग आपको केवल कई रिपॉजिटरी का उपयोग करने के लिए कहेंगे, मुझे लगता है कि यह ध्यान देने योग्य है कि अन्य समाधान हैं।

समाधान 1

एक एकल भंडार में कई स्वतंत्र शाखाएं हो सकती हैं , जिन्हें अनाथ शाखा कहा जाता है । अनाथ शाखाएं एक दूसरे से पूरी तरह से अलग हैं; वे इतिहास साझा नहीं करते हैं।

git checkout --orphan BRANCHNAME

यह आपकी वर्तमान शाखा से असंबंधित एक नई शाखा बनाता है। प्रत्येक परियोजना अपनी स्वयं की अनाथ शाखा में होनी चाहिए।

अब जो भी कारण के लिए, अनाथ चेकआउट के बाद गिट को थोड़ी सफाई की आवश्यकता होती है।

rm .git/index
rm -r *

सुनिश्चित करें कि हटाने से पहले सब कुछ प्रतिबद्ध है

अनाथ शाखा साफ होने के बाद, आप इसे सामान्य रूप से उपयोग कर सकते हैं।

समाधान २

अनाथ शाखाओं के सभी झंझटों से बचें। दो स्वतंत्र रिपोजिटरी बनाएं, और उन्हें एक ही रिमोट पर धकेलें। बस प्रत्येक रेपो के लिए विभिन्न शाखा नामों का उपयोग करें।

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

बहुत बहुत धन्यवाद, जो मेरी समस्या को हल करने में सक्षम होना चाहिए। दरअसल, दो समाधान विभिन्न परियोजनाओं को रखने के लिए शाखाओं का उपयोग करते हैं।
स्टोइन

6
मुझे यकीन नहीं है कि मैं समाधान 2 को समझ रहा हूं। क्या आप कह रहे हैं कि आप एक। Git रेपो में सभी .ITI फाइल को कमिट करेंगे? कई अनाथ शाखाओं का उपयोग करके बनाम कई शाखाओं का उपयोग करने के बीच क्या अंतर है?
नैट

13
@ बताएं कि वह क्या कह रहा है: दो अलग-अलग स्थानीय रिपॉजिटरी बनाएं , फिर उन दोनों को गीथहब पर एक ही रिमोट रिपॉजिटरी में धकेल दें ।
द डिक विथ द हट

1
धन्यवाद @TheGuywithTheElfHat अब जब मैं इसे फिर से (9 महीने बाद) देखता हूं तो यह मुझे स्पष्ट लगता है। समाधान 2 अभी भी अनाथ शाखाएं बना रहा है, लेकिन मैं देख सकता हूं कि इस विधि से कैसे निपटना आसान है।
नैट

21
समाधान 2 को अधिक स्पष्टीकरण की आवश्यकता है
eC Droid

19

समाधान 3

यह कई परियोजनाओं के लिए एकल निर्देशिका का उपयोग करने के लिए है। मैं कुछ बारीकी से संबंधित परियोजनाओं के लिए इस तकनीक का उपयोग करता हूं जहां मुझे अक्सर एक परियोजना से दूसरे में परिवर्तन खींचने की आवश्यकता होती है। यह अनाथ शाखाओं के विचार के समान है, लेकिन शाखाओं को अनाथ होने की आवश्यकता नहीं है। बस एक ही खाली निर्देशिका राज्य से सभी परियोजनाओं को शुरू करें।

सभी परियोजनाओं को एक खाली खाली निर्देशिका से शुरू करें

इस समाधान से चमत्कार की उम्मीद न करें। जैसा कि मैंने इसे देखा है, आपको हमेशा अनट्रैक फ़ाइलों के साथ झुंझलाहट होने वाली है। Git का वास्तव में कोई सुराग नहीं है कि उनके साथ क्या करना है और इसलिए यदि कोई संकलक द्वारा बनाई गई मध्यवर्ती फाइलें हैं और आपकी .gitignore फ़ाइल को अनदेखा किया गया है, तो संभावना है कि यदि आप तेजी से स्वैप करने की कोशिश करते हैं तो वे कुछ समय के लिए लटक जाएंगे। बीच - उदाहरण के लिए - आपकी सॉफ्टवेयर परियोजना और PH.D थीसिस परियोजना।

हालाँकि यहाँ योजना है। खाली रिपॉजिटरी के द्वारा, जैसा कि आप किसी भी git प्रोजेक्ट्स को शुरू करने के लिए करना चाहते हैं, शुरू करें, और फिर अपनी सभी प्रॉजेक्ट्स को उसी खाली स्टेट से शुरू करें। इस तरह से आप निश्चित हैं कि दो बहुत सारी फाइलें काफी स्वतंत्र हैं। इसके अलावा, अपनी शाखाओं को एक उचित नाम दें और आलसी न केवल "मास्टर" का उपयोग करें। आपकी परियोजनाओं को अलग करने की आवश्यकता है इसलिए उन्हें उपयुक्त नाम दें।

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

एक खाली भंडार बनाएँ

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

अपनी परियोजनाओं को खाली से शुरू करें।

किसी एक प्रोजेक्ट पर काम करते हैं।

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

दूसरा प्रोजेक्ट शुरू करें

जब तुम चाहो।

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

आगे और पीछे स्विच करें

जब भी आप चाहें परियोजनाओं के बीच वापस और आगे बढ़ें। यह उदाहरण शतरंज सॉफ्टवेयर परियोजना पर वापस जाता है।

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

अनट्रैक की गई फाइलें कष्टप्रद हैं

हालाँकि आप प्रोजेक्ट्स / शाखाओं के बीच स्वैप करने पर अनट्रैक की गई फ़ाइलों से नाराज हो जाएंगे।

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

यह एक अचूक समस्या नहीं है

परिभाषा के अनुसार, git को वास्तव में पता नहीं है कि अनट्रैक की गई फ़ाइलों का क्या करना है और उनसे निपटना आपके लिए है। आप किसी भी प्रकार की फ़ाइलों को बिना किसी शाखा से इधर उधर किए जाने से रोक सकते हैं।

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

यह सुनिश्चित करके कि हमारी नई परियोजना की जाँच करने से पहले निर्देशिका खाली थी, हमने यह सुनिश्चित किया कि किसी अन्य परियोजना से लटकी हुई अनकही फाइलें नहीं थीं।

एक शोधन

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

यदि खाली रिपॉजिटरी करते समय समान तिथियां निर्दिष्ट की जाती हैं, तो स्वतंत्र रूप से बनाए गए खाली रिपॉजिटरी में समान SHA1 कोड हो सकते हैं। यह दो रिपॉजिटरी को स्वतंत्र रूप से बनाने की अनुमति देता है और फिर बाद में एक रिपॉजिटरी में एक आम पेड़ के साथ एक एकल पेड़ में विलय कर दिया जाता है।

उदाहरण

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

परिणाम

मर्ज किए गए रिपॉजिटरी का आरेख

प्रति परियोजना उपनिर्देशिका का उपयोग करें?

यदि आप फ़ाइलों को रखने के बजाय संभव हो तो अपनी परियोजनाओं को उपनिर्देशिकाओं में रखने में मदद कर सकते हैं

chess.prog
philosophy_doctorate.txt 

है

chess/chess.prog
thesis/philosophy_doctorate.txt 

इस मामले में आपकी अनट्रैक सॉफ्टवेयर फ़ाइल होगी chess/untracked_software_file.progthesisनिर्देशिका में काम करते समय आपको अनट्रैकड शतरंज प्रोग्राम फ़ाइलों से परेशान नहीं होना चाहिए, और आपको ऐसे अवसर मिल सकते हैं जब आप अन्य प्रोजेक्ट्स से अनट्रैक्ड फ़ाइलों को हटाए बिना खुशी से काम कर सकते हैं।

साथ ही, यदि आप अन्य प्रोजेक्ट्स से अनटैक की गई फाइल्स को हटाना चाहते हैं, तो अनचाहे डायरेक्टरी को डंप करने की अपेक्षा अनचाहे डायरेक्टरी को डंप करने के लिए यह क्विक (और कम त्रुटि वाला) होगा।

शाखा नामों में '/' अक्षर शामिल हो सकते हैं

इसलिए आप अपनी शाखाओं का नाम कुछ इस तरह रखना चाहते हैं

project1/master
project1/featureABC
project2/master
project2/featureXYZ

9

मैं उपयोग करूंगा git submodules

एक नज़र यहाँ एक Git भंडार में Git भंडार

फरवरी २०१ ९ के अनुसार, मैं सुझाव दूंगा Monorepos


5
"मेरे पास उपयोग करने के लिए केवल एक भंडार है।" क्या आप यह समझाने की परवाह करेंगे कि आप एक ही रिपॉजिटरी में कई सबमॉड्यूल्स को कैसे स्टोर करेंगे?
इवान

4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv

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