Git का उपयोग करते हुए, मैं एक शाखा में एक फ़ाइल को कैसे अनदेखा कर सकता हूं लेकिन क्या उसने किसी अन्य शाखा में प्रतिबद्ध किया है?


157

मुझे एक प्रोजेक्ट मिला है जिसे मैं हरोकू में तैनात कर रहा हूं । स्रोत कोड ट्री में एमपी 3 फ़ाइलों का एक समूह शामिल है (वेबसाइट एक रिकॉर्डिंग परियोजना के लिए होगी जिसमें मैं भारी रूप से शामिल था)।

मैं इसके लिए स्रोत कोड GitHub पर रखना चाहूंगा , लेकिन GitHub की उनके मुफ़्त खातों पर 300 एमबी की सीमा है। मैं एमपी 3 फ़ाइलों के एक समूह पर अपनी सीमा के 50 एमबी का उपयोग नहीं करना चाहता। जाहिर है, मैं .gitignoreउन्हें अपने रेपो से बाहर रखने के लिए फाइल में जोड़ सकता था ।

हालांकि, मैं हरोकू का उपयोग कर रहा हूं git push heroku। एमपी 3 फाइलें उस शाखा में मौजूद होनी चाहिए जिसे मैं हरोकू में धकेलता हूं ताकि वे तैनात हो जाएं।

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

मुझे यह सही काम करने के लिए नहीं मिल सकता है।

यहाँ एक उदाहरण है जो मैं करने की कोशिश कर रहा हूँ ...

$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored

इस बिंदु पर, मेरी मास्टर शाखा में Foo.ignored को अनदेखा किया गया है, लेकिन यह अभी भी मौजूद है, इसलिए मेरी परियोजना इसका उपयोग कर सकती है।

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"

अब मुझे इन फ़ाइलों के साथ एक शाखा मिल गई है, जैसा मैं चाहता हूँ। हालाँकि, जब मैं अपनी मास्टर शाखा में वापस जाता हूं, तो Foo.ignored गया है।

किसी को भी इसे स्थापित करने के लिए एक बेहतर तरीके के लिए कोई सुझाव मिला?

संपादित करें: बस स्पष्ट करने के लिए, मैं चाहता हूं कि एमपी 3 फाइलें दोनों शाखाओं में मौजूद हों ताकि जब मैं साइट को स्थानीय रूप से चलाऊं (या तो शाखा का उपयोग करके) साइट काम करे। मैं बस चाहता हूं कि फाइलें एक शाखा में नजरअंदाज हो जाएं, इसलिए जब मैं गिटहब पर धक्का देता हूं तो उन्हें धक्का नहीं दिया जाता है। आमतौर पर .itignore इस तरह की चीज़ों के लिए अच्छी तरह से काम करता है (अर्थात किसी फ़ाइल की स्थानीय प्रतिलिपि जिसे किसी रिमोट में पुश में शामिल नहीं किया जाता है) को ध्यान में रखते हुए, लेकिन जब मैं जाँच की गई फ़ाइलों के साथ शाखा में स्विच करता हूँ और फिर वापस फ़ाइलों को अनदेखा करने के साथ शाखा, फ़ाइलें गायब हो जाती हैं।


एमपी 3 फ़ाइलों को रिपॉजिटरी के लिए कभी भी प्रतिबद्ध होने की आवश्यकता क्यों है?
Dan Loewenherz

4
जब आप परिनियोजित करते हैं, तो उसके साथ, आपके रेपो के लिए कमिट करना आपके ऐप के साथ फ़ाइलों को शामिल करने का एकमात्र तरीका है। एकमात्र विकल्प एमपी 3 की सेवा के लिए अमेज़ॅन एस 3 जैसे कुछ का उपयोग करना है, लेकिन मैं इससे बचना पसंद करूंगा।
माय्रोन मारस्टन

ऐसा लगता है कि आप पेनी को बचाने के लिए डॉलर पर ट्रिपिंग कर रहे हैं ... रैकस्पेस क्लाउड सेटअप प्राप्त करने के लिए बहुत सरल है, और इसे स्टोर करने के लिए <1 GB फ़ाइलों की बहुत कम लागत आएगी ...
gahooa

3
मैंने देखा कि आपने उत्तर को सही के रूप में चिह्नित किया है, लेकिन मैंने जो पढ़ा है, वह सही नहीं हो सकता है। क्या आपने कभी जवाब की कोशिश की और क्या यह आपके लिए काम किया?
लूप

2
ऑफ टॉपिक: क्या आपने किसी अन्य ओपन सोर्स रिपॉजिटरी होस्ट का उपयोग करने पर विचार किया है? BitBucket की उनके Git रिपॉजिटरी पर कोई आकार सीमा नहीं है, भले ही वे एक स्वतंत्र खाते में हों या नहीं (वे कारण के भीतर आकार रखने का उल्लेख करते हैं, हालांकि)। जब तक आपका रेपो नियंत्रण से बाहर नहीं हो रहा है, यह एक विकल्प हो सकता है। नोट: मैं बिटबकेट के साथ संबद्ध नहीं हूं, सिर्फ एक खुश ग्राहक हूं।
NightOwl888

जवाबों:


84

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

मैंने excludesfileअलग-अलग शाखाओं के लिए प्रभावी ढंग से उपयोग करने के तरीके पर एक ब्लॉग पोस्ट लिखी , जैसे एक सार्वजनिक गितुब के लिए और एक हेरोकू तैनाती के लिए।

यहाँ त्वरित और गंदा है:

$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing 

फिर .it / config फ़ाइल में इन पंक्तियों को जोड़ें:

[core]
excludesfile = +info/exclude


[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing

अब सभी वैश्विक अनदेखी सामान info/excludeफ़ाइल में है और शाखा विशिष्ट में हैinfo/exclude_from_public_viewing

उम्मीद है की वो मदद करदे!

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches


1
इतना लंबा समय लेने के लिए क्षमा करें .. लेकिन यदि आप .gitignore फ़ाइलों को नहीं हटाते हैं, तो यह पहले उन लोगों के लिए डिफ़ॉल्ट होगा।
अनुभूति। मिंड

4
यह मेरे लिए काम नहीं करता है, तब भी जब परियोजना का उपयोग नहीं होता है। क्या आप इसे ( git init, ...), और आपके द्वारा उपयोग किए गए Git के संस्करण से स्थापित करने वाले आदेशों की एक प्रतिलेख प्रदान करते हैं?
डबरन क्यूब्रिक

34
यह समाधान काम नहीं करता है। ब्लॉग पर कुछ चर्चा हुई, और कोई भी इस काम को करने में सक्षम नहीं था।
स्पूडर


2
वेनिला गिट में, मुझे पूरा यकीन है कि यह काम नहीं करता है और कभी नहीं किया। आप में से जो इसे पुन: उत्पन्न करने में कामयाब रहे, क्या आप अपने Git संस्करण और अन्य प्रासंगिक जानकारी को अपने पर्यावरण पर साझा कर सकते हैं? हो सकता है कि आपके पास आपके वितरण के Git पैकेज अनुरक्षकों से एक पैच संस्करण हो।
पालिक

20

महत्वपूर्ण संकेत : अनुभूति द्वारा स्वीकार किए गए उत्तर। भारत काम नहीं करता है (अब, कई वर्षों के लिए, या शायद वेनिला संस्करणों के लिए); टिप्पणियों को देखें। एक मान्य उत्तर और समाधान यहां पाया जा सकता है:

https://stackoverflow.com/a/29583813/2157640

एक अन्य वैकल्पिक वर्कअराउंड (मेरी विशेष समस्या के लिए काम कर रहा है, लेकिन मैनुअल स्टेश संचालन या हुक के कार्यान्वयन की मांग करना) होगा git stash -u -a। यह थकाऊ है जब मतभेद बड़े होते हैं।

और अंत में, अब मैं जिस समाधान के साथ जा रहा हूं, वह मेरे वीएम को कांटेक्ट कर रहा है कि हम अपने विकास के माहौल को पकड़ें और स्थापित करें info/excludes शाखा के लिए उचित रूप से , क्रमशः आपत्तिजनक, अनकम्फर्ड फ़ाइलों / फ़ोल्डरों को हटा दें।


14

मैं S3 पर उन एमपी 3 फ़ाइलों को डालने पर विचार करने की दृढ़ता से सलाह दूंगा। उन्हें अपने हरोकू पुश का हिस्सा होना चाहिए (और इस तरह आपके हरोकू स्लग का हिस्सा) आपके डायनो स्टार्टअप समय को बहुत धीमा कर देगा। चूंकि हरोकू EC2 का उपयोग करता है, यदि फाइलें S3 पर हैं और केवल आपके ऐप द्वारा एक्सेस की जाती हैं (यदि उपयोगकर्ता सीधे S3 से लिंक नहीं हैं) तो आप किसी बैंडविड्थ चार्ज का भुगतान भी नहीं करेंगे, केवल 50MB स्टोर करने का चार्ज।


13

मान लें कि हम buildशाखा को छोड़कर अन्य सभी शाखा से फ़ोल्डर को अनदेखा करना चाहते हैं production। जैसा कि हम buildउत्पादन में फ़ोल्डर पुश करना चाहते हैं ।

1) शामिल नहीं है build .जिग्नोर में । यदि आप ऐसा करते हैं तो इसे हमेशा सभी शाखाओं के लिए नजरअंदाज कर दिया जाएगा।

2) exclude_from_public_viewingअंदर एक फ़ाइल बनाएं ./.git/info(यह फ़ोल्डर पहले से मौजूद है) फ़ोल्डरtouch ./.git/info/exclude_from_public_viewing

3) अंदर exclude_from_public_viewingएक पंक्ति लिखें (जैसा कि आप buildसभी शाखाओं के लिए उपेक्षा कर रहे हैं )। !build

4) एक मौजूदा फ़ाइल है .git/info/exclude। हमें इसमें निम्नलिखित पंक्ति जोड़ने की आवश्यकता है।

 build

हम buildफ़ोल्डर को अनदेखा करना चाहते हैं, लेकिन इसे .ignignore में नहीं जोड़ा है। तो कैसे पता चलेगा कि क्या उपेक्षा? उत्तर है कि हम इसे excludeफ़ाइल में जोड़ रहे हैं और सशर्त रूप से उस फ़ाइल को पास कर रहे हैंgit config

५) अब हमें शाखा के लिए सशर्त रूप से एकरूप buildफ़ोल्डर है production। उस प्रदर्शन को करने के लिए

6) एक मौजूदा फ़ाइल है जिसे ./.git/configहमें निम्नलिखित जोड़ने की आवश्यकता है -

क) excludesfile = +info/excludeनीचे[core]

[core]
     excludesfile = +info/exclude

ख) के अंत में एक नया खंड बनाने ./.git/configके रूप में

[branch "production"]
    excludesfile = +info/exclude_from_public_viewing

समाधान २

एक स्मार्ट वैकल्पिक समाधान है। कहते हैं कि आप शाखा build/में फ़ोल्डर जोड़ना चाहते हैं productionऔर इसे अन्य सभी शाखाओं में अनदेखा करते हैं।

1) इसे अपनी gitignoreफ़ाइल में जोड़ें ।

2) उत्पादन शाखा में, करते समय git add, buildफोल्डर जोड़ें :git add -f --all build/


और यह स्वीकृत समाधान से अलग है? किस संस्करण के साथ आपने इसे परीक्षण किया? जैसा कि जुड़ा हुआ उत्तर बताता है कि यह विफल हो गया है क्योंकि branch.<name>.excludesfilegit (अब?) के लिए कोई समर्थन नहीं है, केवल core.excludesfileऔर इसके लिए मेरे स्वयं के परीक्षण इस बात की पुष्टि करते हैं।
मर्फी

@ मर्फी के साथ यह ठीक काम करता है git version 2.7.4 (Apple Git-66)और मैंने branch.<name>.excludesfile अपने समाधान में उपयोग नहीं किया है।
sapy

4
@ थेरेपी: मैंने ओपी के उपयोग-मामले के अनुसार यह कोशिश की, और जब मैं उत्पादन से मास्टर में स्विच करता हूं तो फ़ाइल अभी भी गायब हो जाती है। ध्यान दें कि "बिल्ड" फ़ोल्डर को "उत्पादन" शाखा में प्रतिबद्ध होना चाहिए। (इसके अलावा, मैं ध्यान देता हूं कि अगर मैं "प्रोडक्शन" ब्रांच में "बिल्ड" फोल्डर को कमिट नहीं करता हूं, तो "प्रोडक्शन" ब्रांच "बिल्ड" फोल्डर की मौजूदगी को नजरअंदाज कर देता है - यानी, [ब्रांच "प्रोडक्शन"] एक्सेसेफाइल कॉन्फिग नहीं करता है। 't काम)। मैं आपके समान ही git के संस्करण का उपयोग करता हूं। मैंने उत्पादन शाखा में केवल फ़ाइल को अनदेखा करने के लिए [शाखा "उत्पादन"] दृष्टिकोण की कोशिश की , यह भी काम नहीं करता है, जैसे मर्फी ने कहा।
जस्टफुल

समाधान 2 कुछ ऐसा था जिसकी मुझे तलाश थी। धन्यवाद!
व्याचेस्लाव कोटरुता

4

क्या आपने कोशिश की है। आपकी शाखा में .ignignore अलग है?

जब तक आप उस शाखा पर फ़ाइलों को ट्रैक नहीं कर लेते, तब तक आप जो चाहते हैं, उसके आधार पर आपको अनदेखा करने में सक्षम होना चाहिए।


6
मैंने वह कोशिश की है। यदि आप उन कमांड्स को देखेंगे जिन्हें मैंने ऊपर पोस्ट किया था तो आप देखेंगे कि वास्तव में मैंने ऐसा किया था। समस्या यह है कि जब मैं शाखा से जाँच की गई फ़ाइलों के साथ शाखा से स्विच करता हूँ, तो जिन फ़ाइलों को अनदेखा किया जाता है, वे फ़ाइलों को त्याग देती हैं। मैं अपनी मास्टर ब्रांच में MP3 रखना चाहता हूं, ताकि साइट देव मोड में ठीक से काम करे, भले ही फाइलों को नजरअंदाज कर दिया जाए।
Myron Marston

1
उन्होंने पहले ही कहा था कि उन्होंने क्या किया। शायद इस जवाब को हटाना ही सबसे अच्छा होगा :-) इसका कारण व्याकुलता है।
बम

3

1. सारांश

  1. मैं ट्रैविस सीआई की तैनाती के लिए उपयोग करता हूं ( यह हरोकू की तैनाती का समर्थन करता है )
  2. मैं अपने को जोड़ता हूं .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore

    जहां misc- किसी भी फ़ोल्डर में, एक और शामिल है .gitignore

    mvUNIX कमांड कदम फ़ाइल; ओवरराइट करें, यदि फ़ाइल पहले से मौजूद है।

जब ट्रैविस सीआई ने परियोजना को तैनात किया है, तो ट्रैविस सीआई प्रदाता फाइलों और फ़ोल्डरों को तैनात करने पर जोर नहीं देगा , जो कि misc/.gitignore( .gitignoreस्रोतों के मूल में नहीं) में अनदेखी करते हैं ।


2. सीमा

  1. यह उत्तर लेखक की सभी स्थितियों के लिए उपयुक्त नहीं हो सकता है। लेकिन यह जवाब इस सवाल का जवाब देता है "मैं git का उपयोग कर रहा हूं, मैं एक शाखा में किसी फ़ाइल को कैसे अनदेखा कर सकता हूं लेकिन क्या उसने किसी अन्य शाखा में प्रतिबद्ध किया है?"
  2. मैं Heroku उपयोगकर्ता नहीं हूँ, GitHub के लिए मेरे उदाहरण , Heroku के लिए नहीं। इस उत्तर का डेटा GitHub में मेरे लिए काम करता है, लेकिन हरोकू पर काम नहीं कर सकता।

3. प्रासंगिकता

यह उत्तर अप्रैल 2018 के लिए प्रासंगिक है। भविष्य में, इस उत्तर का डेटा अप्रचलित हो सकता है।


4. प्रदर्शन

मेरा असली प्रोजेक्ट

सफल तैनाती का उदाहरण

4.1। कार्य

मैं अपनी परियोजना को src शाखा से उसी रिपॉजिटरी की शाखा को नष्ट करने के लिए तैनात करता हूं।

मुझे चाहिए, वह फाइल PaletteMira.suricate-profile:

  • स्थानीय मशीन - सभी शाखाओं के लिए मौजूद है,
  • src दूरस्थ शाखा - मौजूद नहीं है,
  • गंतव्य दूरस्थ शाखा - मौजूद है।

यदि मैं प्रश्न के लेखक को सही ढंग से समझता हूं, तो उसके पास समान कार्य है।

4.2। src

सूत्रों शाखा - SashaYAML

का हिस्सा .travis.yml:

before_deploy:
- mv misc/.gitignore .gitignore

deploy:
  provider: pages
  on:
    branch: SashaYAML
  keep-history: true
  skip-cleanup: true
  target-branch: SashaDevelop
  repo: Kristinita/PaletteMira
  github-token: $GITHUB_TOKEN
  committer-from-gh: true
  project-name: PaletteMira
verbose: true

का हिस्सा .gitignore:

*.sublime-snippet
*.suricate-profile

का हिस्सा misc/.gitignore

*.sublime-snippet

*.suricate-profileमें नहीं misc/.gitignore

PaletteMira.suricate-profile इस शाखा में दूरस्थ रूप से मौजूद नहीं है, लेकिन स्थानीय रूप से मौजूद है।

4.3। गंतव्य

गंतव्य शाखा - SashaDevelop

का हिस्सा .gitignore:

*.sublime-snippet

*.suricate-profileमें नहीं misc/.gitignore

PaletteMira.suricate-profileइस शाखा के लिए दूरस्थ रूप से और स्थानीय रूप से मौजूद है ।

4.4। प्रजनन करने कि प्रक्रिया

मैं ट्रैविस CI के लिए पैलेटमीरा गिटहब रिपॉजिटरी को सक्षम करता हूं → मैं पर्यावरण चर $GITHUB_TOKEN को मान के साथ सेट करता हूं - मेरा गिटहब टोकन → मैं अपने एसकेसी शाखा के लिए कोई भी प्रतिबद्ध करता हूं।

यदि कोई त्रुटि नहीं है, तो मुझे अपेक्षित व्यवहार मिलना चाहिए ।


0

क्या आप हरोकू से प्रतिबद्ध और धक्का दे सकते हैं?

उदाहरण के लिए, ऑडियो जोड़ें, उन्हें गितुब और हेरोकू में धकेलें, हरोकू पर काम की प्रतिलिपि पर फ़ाइलों को हटा दें। रेपो से ऑडियो निकालें, लेकिन डिस्क से नहीं, फिर उस परिवर्तन को वापस गीथब में धकेलें।


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