2010-06-24 20 views
12

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

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

जाहिर है, ऐसा करने का तरीका एक मर्ज ड्राइवर के माध्यम से है। तो, मैं "अनदेखा" ड्राइवर बना लिया है:

[merge "ignore"] 
name = always ignore during merge 
driver = ignore.sh %0 %A %B 

और मेरे $ पथ पर ignore.sh फ़ाइल बनाई:

exit 0 

मेरे द्वारा बनाए गए .gitattributes सार्वजनिक/अंदर दाखिल, क्योंकि फ़ोटोशॉप फ़ोल्डर पूरे में नजरअंदाज कर दिया और किया जाना चाहिए यह जनता के तहत प्रकट करने के लिए/जा रहा है:

photoshop merge=ignore 
photoshop/ merge=ignore 
photoshop/* merge=ignore 
photoshop/**/* merge=ignore 

आप देख सकते हैं, मैं पूरी फ़ोल्डर अनदेखी करने के लिए कई अलग अलग पैटर्न की कोशिश की है, लेकिन यह काम नहीं करता। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि मास्टर शाखा पर कोई फ़ोल्डर नहीं है, इसलिए कोई संघर्ष नहीं है और इसलिए गिट अनदेखा चालक का उपयोग नहीं करता है। क्या मास्टर पर सार्वजनिक/फ़ोटोशॉप फ़ोल्डर बनाने के बिना इसे हासिल करने का कोई तरीका है?

धन्यवाद!

+0

संभावित डुप्लिकेट [मैं एक विशिष्ट फ़ाइल पर विवादित विलय के लिए हमेशा अपने स्थानीय संस्करण का चयन करने के लिए गिट कैसे कहूं?] (Http://stackoverflow.com/questions/928646/how-do-i-tell-git- हमेशा-चयन-मेरे-स्थानीय-संस्करण-के लिए विवादित-विलय-ऑन-ए) – givanse

उत्तर

16

जैसा कि मेरे अन्य उत्तर द्वारा सुझाया गया है, यहां समाधान के विस्तारित, सामान्यीकृत, औद्योगिक-शक्ति संस्करण को चलाया गया है।

(हाँ, मैं घर पर ऊब और ऐसा करने के लिए बेहतर और कुछ नहीं था: पी), तो यह एक नया, अलग अपने स्थानीय डिजाइन शाखा के आधार पर प्रतिबद्ध

यह स्क्रिप्ट जोड़ देगा न तो डिजाइन भंडार या आपकी डिजाइन शाखा को प्रभावित करेगा। प्रतिबद्धता में सभी वांछित फाइलें हटा दी जाएंगी। फिर यह विलय करता है।

भी भरा कोड, निम्न चरणों का "मूल" पढ़ने के लिए आलसी उन लोगों के लिए के रूप में सरल किया जा सकता:

original=$(gitbranch HEAD) # current branch name, or sha1 if not in a branch 
branchsha=$(gitsha "$branch") # sha1 of a ref, to force detached commit 

git checkout "$branchsha" && 
git rm -rf "${files[@]}" && 
git commit -m "$msgcommit" && 
newsha=$(gitsha HEAD)  && 
git checkout "$original" && 
git merge -m "$msgmerge" "${mergeopts[@]}" "$newsha" 

और यहाँ पूर्ण स्क्रिप्ट है:

(थोड़ा करने के लिए संशोधित कमजोर और सीमित तो चलो वाक्य रचना रंग से निपटने, तो यह बेहतर है नीचे दिए गए लिंक से प्राचीन स्रोत प्राप्त करने के लिए)

git-strip-merge

#!/bin/bash 
# 
# git-strip-merge - a git-merge that delete files on branch before merging 
# 
# Copyright (C) 2012 Rodrigo Silva (MestreLion) <[email protected]> 
# 
# This program is free software: you can redistribute it and/or modify 
# it under the terms of the GNU General Public License as published by 
# the Free Software Foundation, either version 3 of the License, or 
# (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with this program. If not see <http://www.gnu.org/licenses/gpl.html> 
# 
# Answer for "How to setup a git driver to ignore a folder on merge?" 
# See http://stackoverflow.com/questions/3111515 

#Defaults: 
msgcommit="remove files from '<branch>' before merge" 
msgmerge="Merge stripped branch '<branch>'" 
verbose=0 
quiet=(--quiet) 

usage() { 
    cat <<- USAGE 
    Usage: $myname [git-merge options] [-M <commitmsg>] <branch> FILE... 
    USAGE 
    if [[ "$1" ]] ; then 
     cat >&2 <<- USAGE 
     Try '$myname --help' for more information. 
     USAGE 
     exit 1 
    fi 
    cat <<-USAGE 

    "git-merge that delete files on "foreign" <branch> before merging 

    Useful for ignoring a folder in <branch> before merging it with 
    current branch. Works by deleting FILE(S) in a detached commit based 
    on <branch>, and then performing the merge of this new commit in the 
    current branch. Note that <branch> is not changed by this procedure. 
    Also note that <branch> may actually be any reference, like a tag, 
    or a remote branch, or even a commit SHA. 

    For more information, see <http://stackoverflow.com/questions/3111515> 

    Options: 
     -h, --help 
     show this page. 

     -v, --verbose 
     do not use -q to supress normal output of internal steps from git 
     checkout, rm, commit. By default, only git merge output is shown. 
     Errors, however, are never supressed 

     -M <message>, --msgcommit=<message> 
     message for the removal commit in <branch>. Not to be confused 
     with the message of the merge commit, which is set by -m. Default 
     message is: "$msgcommit" 

     -m <message>, --message=<message> 
     message for the merge commit. Since we are not merging <branch> 
     directly, but rather a detached commit based on it, we forge a 
     message similar to git's default for a branch merge. Otherwise 
     git would use in message the full and ugly SHA1 of our commit. 
     Default message is: "$msgmerge" 

     For both commit messages, the token "<branch>" is replaced for the 
     actual <branch> name. 

    Additional options are passed unchecked to git merge. 

    All options must precede <branch> and FILE(s), except -h and --help 
    that may appear anywhere on the command line. 

    Example: 
     $myname design "photoshop/*" 

    Copyright (C) 2012 Rodrigo Silva (MestreLion) <[email protected]> 
    License: GPLv3 or later. See <http://www.gnu.org/licenses/gpl.html>" 
    USAGE 
    exit 0 
} 

# Helper functions 
myname="${0##*/}" 
argerr() { printf "%s: %s\n" "${0##*/}" "${1:-error}" >&2 ; usage 1 ; } 
invalid() { argerr "invalid option: $1" ; } 
missing() { argerr "missing ${2:+$2 }operand${1:+ from $1}." ; } 

# Option handling 
files=() 
mergeopts=() 
for arg in "[email protected]"; do case "$arg" in -h|--help) usage ;; esac; done 
while (($#)); do 
    case "$1" in 
    -v|--verbose ) verbose=1   ;; 
    -M   ) shift ; msgcommit=$1 ;; 
    -m   ) shift ; msgmerge=$1 ;; 
    --msgcommit=*) msgcommit=${1#*=} ;; 
    --message=* ) msgmerge=${1#*=}  ;; 
    -*   ) mergeopts+=("$1") ;; 
    *   ) branch="$1" 
        shift ; break  ;; 
    esac 
    shift 
done 
files+=("[email protected]") 

# Argument handling 

msgcommit=${msgcommit//<branch>/$branch} 
msgmerge=${msgmerge//<branch>/$branch} 

[[ "$msgcommit" ]] || missing "msgcommit" "MSG" 
[[ "$branch" ]] || missing ""   "<branch>" 
((${#files[@]})) || missing ""   "FILE" 

((verbose)) && quiet=() 

# Here the fun begins... 
gitsha() { git rev-parse "$1" ; } 
gitbranch() { 
    git symbolic-ref "$1" 2> /dev/null | sed 's/refs\/heads\///' || 
    gitsha "$1" 
} 

original=$(gitbranch HEAD) 
branchsha=$(gitsha "$branch") 

trap 'git checkout --quiet "$original"' EXIT 

git checkout "$branchsha" "${quiet[@]}" && 
git rm -rf "${files[@]}" "${quiet[@]}" && 
git commit -m "$msgcommit" "${quiet[@]}" && 
newsha=$(gitsha HEAD)     && 
git checkout "$original" "${quiet[@]}" && 
git merge -m "$msgmerge" "${mergeopts[@]}" "$newsha" 

आनंद लें!

एक छवि एक हजार से अधिक शब्दों के लायक है ...

मर्ज से पहले:

enter image description here

ध्यान दें कि "डिजाइन" शाखा टिप बिल्कुल प्रभावित नहीं था, यहां तक ​​कि एक स्थानीय शाखा जा रहा है, धन्यवाद करने के लिए:

enter image description here

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

+0

दिलचस्प दृष्टिकोण। +1। मुझे इसका परीक्षण करना होगा। एक अलग सिर विलय करके, इसका मतलब यह होगा कि आप वास्तव में उन सभी विलयों को "देखें" (एक गिट में) नहीं करेंगे, है ना? इसके अलावा क्या होता है जब आप कई बार विलय करते हैं? क्या गिट याद रखेगा कि पहले से ही विलय हो रहा है (विशेष रूप से जब उन अलग-अलग सिर को शुद्ध कर दिया गया है?) – VonC

+1

@ वॉनसी: ठीक है, शायद "अलग प्रतिबद्धता" थोड़ा भ्रामक था: यह हर तरह से एक नियमित प्रतिबद्धता है, केवल अंतर यह है कि '' टिप नहीं लेता है। – MestreLion

+0

और हाँ, चूंकि यह एक नियमित प्रतिबद्धता है, और एक नियमित विलय है, तो आप दोनों देखेंगे, और वे कभी भी छिद्रित/शुद्ध नहीं होंगे। "पृथक" चीज स्थानीय ' की टिप को छोड़ने के लिए सिर्फ एक चाल थी। – MestreLion

0

क्या आपनेशाखा में .gitignore फ़ाइल को photopshop निर्देशिका सामग्री को अनदेखा करने का प्रयास किया है?
फिर डिज़ाइन से master में विलय master में उस नई निर्देशिका को नहीं जोड़ना चाहिए।

यदि यह काम करता है, तो आपको अभी भी एक मर्ज ड्राइवर की आवश्यकता है, लेकिन इस बार .gitignore फ़ाइल की सामग्री का प्रबंधन करने के लिए।

+0

या आप बस अपने $ HOME (यानी, अपने रेल निर्देशिका के बाहर) में गिटिनोरोर डाल सकते हैं और आनंद ले सकते हैं :) – rmk

+0

@rmk: बहुत सच है, लेकिन यह सेटिंग दिलचस्प हो सकती है ('' मास्टर 'शाखा में' 'फ़ोटोशॉप' 'को अनदेखा करना) रेपो से रेपो तक धक्का दिया गया है। – VonC

+0

यह मर्ज स्वीकार नहीं कर रहा है: त्रुटि: अनचाहे काम कर रहे पेड़ फ़ाइल 'सार्वजनिक/फ़ोटोशॉप/फ़ोटोशॉप/bar.psd' विलय से अधिलेखित किया जाएगा। –

10

नहीं एक जवाब से प्रति, लेकिन कुछ नोट .gitignore के बारे में: यह होगा नहीं आप अपनी स्थिति में मदद करते हैं।

.gitignore काम कर पेड़सूचकांक (मंचन क्षेत्र) के लिए जोड़े जाने के लिए से फाइल अनदेखी के लिए है। तो यह केवल तब प्रभावी होता है जब आप git add <files> का उपयोग करते हैं, और इसे अभी भी git add --force <files> का उपयोग करके ओवरराइड किया जा सकता है। यह सिर्फ एक सुविधा शामिल होने से अवांछित फ़ाइलों को रोकने के लिए के रूप में होती है, लेकिन यह भंडार

अपने परिदृश्य में अंदर फाइलों पर कोई प्रभाव नहीं है, .gitignore की जरूरत नहीं है, जब से तुम किसी भी स्थानीय नहीं है ./photoshop फ़ोल्डर, इसलिए आपके पास अपनी मास्टर शाखा में जोड़ने के लिए कभी भी फ़ोटोशॉप फ़ाइलें नहीं होंगी। हालांकि, यह सिर्फ मामले में एक बनाने के लिए चोट नहीं पहुंचाएगा। और डिजाइन टीम .gitignore के लिए आपका स्वागत नहीं है, क्योंकि फ़ोटोशॉप फ़ाइलों को उनकी शाखा में जोड़ा जाना चाहिए।

तो, प्रतिबद्ध डेटा के साथ सौदों के विलय के बाद, और ./photoshop फ़ाइलें पहले से ही भंडार के अंदर हैं, एक मर्ज ड्राइवर का उपयोग करने का आपका दृष्टिकोण सही था।

समस्या है ... डिफ़ॉल्ट एक मर्ज चालक केवल के मामले में शुरू हो रहा है द्वारा विरोध करता है। और, master शाखा में ./photoshop फ़ोल्डर या फ़ाइलें नहीं हैं, सभी पर कोई विवाद नहीं है, वे साफ़ रूप से विलय कर रहे हैं। तो आपके मार्ग पैटर्न के बावजूद आपके मर्ज ड्राइवर का कोई प्रभाव नहीं पड़ा (वैसे, आपका दूसरा, photoshop/, सही था)। मुझे नहीं पता कि गिट मर्ज को गैर-विवादित फ़ाइलों के लिए भी मर्ज ड्राइवर को ट्रिगर करने के लिए कॉन्फ़िगर किया जा सकता है, लेकिन इसके लिए googling लायक है।

जैसा कि मैंने पहले कहा है, मेरा जवाब आपकी समस्या का सही समाधान नहीं है। मुझे उम्मीद है कि इस विषय पर कुछ प्रकाश डालने की उम्मीद है, यह बताते हुए कि मर्ज ड्राइवर और .gitignore का उपयोग करने के आपके प्रयास क्यों विफल रहे हैं। मैं ड्राइवरों को मर्ज करने (कॉन्फ़िगर करने) के बारे में अधिक पढ़ने का सुझाव देता हूं। submodules जांच के लायक है।

आशा है कि इससे मदद मिलती है!

अद्यतन

Maybe my other answer will help you:

Usage: git-strip-merge [git-merge options] [-M <commitmsg>] <branch> FILE... 

git-strip-merge

का आनंद लें!

+2

+1। हालांकि आपको एहसास है कि ओपी पिछले 18 महीनों से एसओ पर नहीं देखा गया है, है ना? उम्मीद है कि यह दूसरों को विचार दे सकता है। – VonC

+2

@ वॉनसी: हाँ, मुझे एहसास है कि यह एक प्राचीन प्रश्न है, और शायद कोई भी पढ़/देखभाल नहीं करेगा। लेकिन, फिर भी, संदर्भ साइट के रूप में SO अच्छा है, और अन्य (या यहां तक ​​कि खुद) भविष्य में इस मुद्दे पर ठोकर खा सकते हैं, जैसा कि मैंने अभी किया था। – MestreLion

+0

वैसे भी किया। और मैं हमेशा * पिछले साढ़े सालों से पढ़ता हूं। और देखभाल। – VonC

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