2009-11-27 11 views
22

मैं कुछ Git सवाल यहाँ पढ़ा है, लेकिन यह एक का उत्तर नहीं मिल सकता है:Git: सार्वजनिक और निजी शाखाओं मर्ज करते हुए, जबकि कुछ फ़ाइलों दोनों शाखाओं में हाथ लगाए बिना

मैं एक सार्वजनिक और निजी है शाखाएं जहां मैं कुछ फाइलों को अलग करने की अनुमति देना चाहता हूं।

वे पासवर्ड और मेरे स्थानीय अनुकूलन के साथ कॉन्फ़िगरेशन फ़ाइलें हैं।

मैं शाखाओं को दोनों तरीकों से विलय करने में सक्षम होना चाहता हूं: निजी से सार्वजनिक और पीछे तक, लेकिन मैं कभी भी उन विशिष्ट फ़ाइलों को स्वचालित रूप से विलय नहीं करना चाहता हूं।

क्या इस तरह गिट स्थापित करने का कोई तरीका है? मुझे एक स्वचालित समाधान ढूंढना अच्छा लगेगा :) - ताकि विलय सामान्य रूप से किया जा सके।


संपादित करें: यहाँ समाधान है कि

मेरे लिए केवल अप्रत्याशित बात यह थी कि "सुरक्षा मर्ज" काम कर फ़ाइलें के बाद ही शुरू होता है (gitattribute पर सलाह के लिए VonC के लिए धन्यवाद) मेरे लिए काम किया है दो शाखाओं में अलग हुए, नहीं तुरंत बाद निम्नलिखित विन्यास लागू किया गया था

.gitattributes या .git/जानकारी/विशेषताओं (Git के साथ ट्रैक अगर आप इस साझा करना चाहते हैं):

file1  merge=keepmine 
path/file2  merge=keepmine 

keepmine नामित कस्टम मर्ज प्रबंधक सिर्फ एक do-कुछ भी नहीं आदेश चयनित फ़ाइलों पर आंतरिक मर्ज चालक के बजाय कहा जाता है, इसमें वे

जब सार्वजनिक शाखा को निजी से विलय मैं आमतौर पर git merge --squash private कर नीचे सेट किया गया है । इस तरह निजी संपादन सार्वजनिक शाखा पर गिट इतिहास में नहीं मिलेगा।

.git/config:

#public repository 
[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = <public repo git url> 

#private repository 
#has to set up with git init and populated with the initial commit to branch mybranch 
[remote "private"] 
    push = +: 
    url = /path/to/local/private/repo 
[merge "keepmine"] 
    name = dont_merge_selected_files 
    driver = echo %O %A %B 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 

#private branch settings 
[branch "mybranch"] 
    remote = private 
    merge = refs/heads/mybranch 

वहाँ सुधार करने के लिए इस टिप्पणी कृपया

उत्तर

14

सुरक्षित पक्ष पर रहने के लिए, आप उन निजी फ़ाइलों के लिए git attribute (here for an example देखें) जोड़ सकते हैं।

इस तरह, आप एक स्क्रिप्ट (एक "मर्ज मैनेजर") परिभाषित कर सकते हैं जो सुनिश्चित करेगा कि निजी सूचनाओं सहित फ़ाइल सार्वजनिक शाखा पर विलय होने पर खाली हो जाएगी (या सार्वजनिक सामग्री के साथ), स्थानीय सामग्री को रखते हुए, निजी शाखा में विलय
इसका मतलब है कि आप उस फ़ाइल के बारे में सोचने के बिना विलय/पुन: विलय कर सकते हैं।

+0

यह काम करता है, धन्यवाद! – Evgeny

+1

यह केवल तब काम करता है जब फ़ाइल दोनों शाखाओं में बदल जाती है। एक बार विलय के साथ विलय का समाधान हो जाने के बाद, दूसरी शाखा में निम्नलिखित विलय रिकर्स द्वारा हल किया जाएगा। – f3r3nc

2

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

+0

यकीन है, लेकिन पासवर्ड यहां मामूली बिंदु है। – Evgeny

3

ऐसा करने का एक तरीका git rebase के साथ है। अपने निजी बदलावों को अपने master के अंत से बाहर रखकर, आप सार्वजनिक सामान master शाखा (या जो भी आप अपनी कार्यशील शाखा चुनते हैं) में कर सकते हैं, और फिर जब भी आप अपडेट करना चाहते हैं तो मास्टर के खिलाफ अपनी निजी शाखा को रीबेस करें ।

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

3

यह विलय विवादों का पता चला है तो यह केवल काम करता प्रतीत होता है। शाखाओं के बीच आगे और पीछे विलय करना फ़ाइल को ओवरराइट किया जाता है। जब तक मैं कुछ गलत नहीं करता। बेशक यह विंडोज़ msysgit गिट संस्करण 1.6.5.1.1367 पर।

+0

@Yoyodyn हाँ, आप सही हैं केवल यह विलय विवादों वाली फ़ाइलों पर काम करता है। – Evgeny

+0

आप सार्वजनिक रूप से निजी से केवल एक ही तरीके से विलय करने पर विचार कर सकते हैं, लेकिन इस मामले में आपको अनुशासित रहना होगा - केवल सार्वजनिक शाखा/भंडार – Evgeny

+0

पर सार्वजनिक सुविधाओं को विकसित करना होगा जो मुझे वास्तव में मिला है वह एक ही रेपो के तीन क्लोन हैं विभिन्न भौगोलिक स्थानों पर। हमारा कार्यालय मास्टर शाखा में काम करता है, दूसरी साइट टेस्ट शाखा में काम करती है ताकि ग्राहक क्यूए कर सके, और तीसरा उत्पादन शाखा है जहां वर्तमान में चल रहा कोड स्थित है। हमारे पास कम से कम एक फ़ाइल Macros.h है जिसमें हम सी ++ प्रोजेक्ट्स में शामिल हैं जो मैक्रोज़ के लिए अलग-अलग मान रखते हैं, चाहे उसके मास्टर, टेस्ट या प्रोडक्शन के आधार पर। मैं macros.h फ़ाइल को शाखाओं के बीच विलय होने से रोकने के लिए एक रास्ता खोजने का प्रयास कर रहा हूं। – yoyodyn

संबंधित मुद्दे