एक निर्देशिका में दो गिट रिपोजिटरी?


86

क्या एक निर्देशिका में 2 गिट रिपोजिटरी होना संभव है? मुझे नहीं लगता, लेकिन मैंने सोचा था कि मैं पूछूंगा। मूल रूप से, मैं अपनी होम डाइरेक्टरी कॉन्फिग फाइलों (जैसे .emacs) को जांचना चाहता हूं, जो मेरे द्वारा काम करने वाली सभी मशीनों में सामान्य होनी चाहिए, लेकिन स्थानीय फाइलों (जैसे .emacs.local) के लिए दूसरा रिपॉजिटरी है, जिसमें शामिल हैं। मशीन-विशिष्ट कॉन्फ़िगरेशन। एक ही तरीका है कि मैं ऐसा करने के लिए सोच सकता हूं कि एक उपनिर्देशिका में स्थानीय विन्यास है और मुख्य उपप्रकार रिपॉजिटरी से उस उपनिर्देशिका को अनदेखा करें। कोई अन्य विचार?


git subtreeकाम पूरा हो जाएगा।
सिड पाओ

यदि आप बहुत अधिक फ़ाइलों के साथ काम नहीं कर रहे हैं, तो आप सिमिलिंक / जंक्शन भी बना सकते हैं।
थुदान

जवाबों:


37

अगर मैं समझता हूं कि आप क्या कर रहे हैं, तो आप इसे एक रिपॉजिटरी में सभी को संभाल सकते हैं, प्रत्येक मशीन के लिए अलग-अलग शाखाओं का उपयोग कर सकते हैं, और एक शाखा जिसमें आपकी सामान्य होम डायरेक्टरी कॉन्फिग फाइल्स हो सकती हैं।

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

फिर प्रत्येक मशीन पर, उस मशीन की शाखा को चेकआउट करें, जिसमें सामान्य कॉन्फिग फाइल भी शामिल होगी।


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

मर्क्यूरियल और गिट दोनों का उपयोग करें।
लिनक

171

यह लेख इस अपेक्षाकृत अच्छी तरह से कवर करता है:

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

मूल रूप से यदि आप कमांड-लाइन से काम कर रहे हैं तो यह आपके अनुमान से अधिक सरल है। मान लें कि आपको 2 git repos चाहिए:

.gitone
.gittwo

आप उन्हें इस तरह सेट कर सकते हैं:

git init .
mv .git .gitone
git init .
mv .git .gittwo

आप एक फ़ाइल जोड़ सकते हैं और इसे केवल एक ही पसंद कर सकते हैं:

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

तो git के विकल्प पहले आते हैं, फिर कमांड, फिर git कमांड के विकल्प आते हैं। आप आसानी से एक उपनाम आदेश की तरह पर्याप्त रूप से कर सकते हैं:

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

तो आप थोड़ा कम टाइपिंग के साथ एक या दूसरे को कमिट कर सकते हैं, जैसे gitone commit -m "blah"

चालबाजी करने के लिए जो दिखाई देता है वह उपेक्षा है। चूंकि .ignignore आम तौर पर प्रोजेक्ट रूट में बैठता है, इसलिए आपको इसे पूरा रूट स्विच किए बिना इसे स्विच करने का एक तरीका खोजना होगा। या, आप .गित / जानकारी / बहिष्कृत का उपयोग कर सकते हैं, लेकिन आपके द्वारा प्रदर्शन किए जाने वाले सभी इग्नोर तब प्रतिबद्ध या पुश नहीं किए जाएंगे - जो अन्य उपयोगकर्ताओं को पेंच कर सकते हैं। रेपो का उपयोग करने वाले अन्य लोग एक .gitignore को धक्का दे सकते हैं, जिससे टकराव हो सकता है। इन मुद्दों को हल करने का सबसे अच्छा तरीका मेरे लिए स्पष्ट नहीं है।

यदि आप TortoiseGit जैसे GUI उपकरण पसंद करते हैं, तो आपके सामने कुछ चुनौतियाँ भी होंगी। आप एक छोटी सी स्क्रिप्ट लिख सकते हैं जो कि .amesone या .gittwo to .git को अस्थायी रूप से नामांकित करता है ताकि इन उपकरणों की धारणाओं को पूरा किया जा सके।


1
इसे एक उपनाम के रूप में सेट करना इस त्रुटि को पूरा करता है: $ git config --global alias.pub '--git-dir = ~ / Server / www / .itpublic' $ git pub add। घातक: उपनाम 'पब' पर्यावरण चर बदलता है आप ऐसा करने के लिए उपनाम में 'git' का उपयोग कर सकते हैं। आप इस मामले में "git" कहाँ सेट करेंगे?
जारेडब्रोड

1
@JaredBroad दिलचस्प - मैं सुझाव दे रहा था कि आप एक बैश उर्फ ​​का उपयोग करें, न कि एक अन्य उपनाम। जैसेalias gitone='git --git-dir=.gitone'
क्रिस मोसिनची

10
आप अपनी खुद की अपवर्जित फ़ाइलों का उपयोग करने के लिए रेपो को कॉन्फ़िगर कर सकते हैं और आप उन, यानी gitone config core.excludesfile gitone.excludeऔर को ट्रैक कर सकते हैं gitone add gitone.exclude। मैंने एक स्क्रिप्ट बनाई जो इस समाधान पर फैलती है: github.com/capr/multigit

2
@JaredBroad मैंने इसे git config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'तब किया git youralias status:) :)
स्टारिकॉव्स

1
यदि आप यह धारणा बनाते हैं कि .gitignoreफाइलें आमतौर पर सेट-एंड-भूल जाती हैं, तो आप प्रत्येक रेपो के लिए अलग-अलग प्रतियां बना सकते हैं, फिर संबंधित संस्करण को उपनाम के भाग के रूप में कॉपी कर सकते हैं। यह रूट की अन्य फ़ाइलों पर लागू होता है, जो संघर्ष कर सकते हैं, जैसे कि README.mdऔर .gitattributes
थुदान

15

गिट सबमॉड्यूल पर एक नजर ।

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


8
उन फ़ाइलों के लिए अच्छा नहीं है जो आपको निर्देशिका के रूट पर होना चाहिए। केवल मौका, इन के लिए सहानुभूति की जड़ को भरना है।
WhyNotHugo

6

रिचीएच ने vcsh नाम का एक टूल लिखा है, जो एक से अधिक वर्किंग डायरेक्टरी को $ HOME में डालने के लिए git के नकली नंगे रिपोज का उपयोग करके dotfiles को प्रबंधित करने का एक टूल है। Csh AFAIK से कोई लेना देना नहीं है।

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


6

यह वैरिएबल का उपयोग करके संभव है, GIT_DIRलेकिन कई कैविटीज़ हैं यदि आपको नहीं पता कि आप क्या कर रहे हैं।


4

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


3

मेरा पसंदीदा तरीका रेपिड को उपडिर में उपयोग कर रहा है, और पुनरावर्ती प्रतीकात्मक लिंक का उपयोग करें:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

जहां ' रेपो / बिल्ड ' -फाइल दिखता है:

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "$0")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

सावधानी : 'गिट ऐड' का उपयोग न करें।


0

दूसरा विकल्प वे अलग-अलग फ़ोल्डरों पर हैं और एक फ़ोल्डर से दूसरे फ़ोल्डर में प्रतीकात्मक हार्ड लिंक बनाते हैं।

उदाहरण के लिए, यदि रिपॉजिटरी हैं:

  1. Repo1 / FolderA
  2. Repo1 / FolderB

तथा:

  1. Repo2 / FolderC

आप फ़ोल्डर्स सिमलिंक कर सकते हैं FolderAऔर FolderBRepo2 में Repo1 से। विंडोज़ के लिए Repo1 पर चलने की आज्ञा होगी:

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

मुख्य रिपॉजिटरी की फाइलों के लिए आपको उनमें से हर एक को सिम्बल करना होगा, साथ ही उन्हें .gitignoreशोर से बचने के लिए रिपॉजिटरी में जोड़ना होगा , जब तक कि आप इसे नहीं चाहते।


0

अस्वीकरण: यह विज्ञापन नहीं है। मैं प्रदान की गई लाइब्रेरी का डेवलपर हूं।

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

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