2011-03-14 5 views
7

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

मैंने http://help.github.com/removing-sensitive-data/ में मार्गदर्शिका का पालन किया और यह मेरे स्थानीय स्रोत पेड़ के साथ-साथ दूरस्थ सर्वर पर भी काम करता है। लेकिन एक बार जब कोई अन्य व्यक्ति दूरस्थ सर्वर से नया डेटा प्राप्त करता है, तो वह सर्वर पर नए कामों को दबाकर बड़ी फ़ाइल को आसानी से पुन: पेश करेगा।

सामान्य रूप से एक टीम के सदस्य अपने को दूसरों के साथ साझा करने के लिए प्रतिबद्ध निम्न करेगा: 'रिबेस' के चरण में

git fetch origin 
git rebase origin/master 
git push origin 

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

कोई सुझाव? धन्यवाद।

+0

है। एक पुश केवल उन वस्तुओं द्वारा पहुंचने योग्य वस्तुओं को धक्का देता है जो पुराने_commit..new_commit में मौजूद किसी भी काम में हैं। –

+0

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

उत्तर

0

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

3

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

एक वैकल्पिक है git rebase --preserve-merges -i जहां आप अपमानजनक प्रतिबद्धता संपादित करते हैं।

+0

> "जब वे नई रिमोट शाखाओं के शीर्ष पर अपने वर्तमान परिवर्तनों को दोबारा दबाते हैं, तो इसे अब बड़ी वस्तु को धक्का नहीं देना चाहिए।" यह मेरा सवाल है, असल में उन्होंने रीबेज के बाद फ़ाइल को पुन: पेश किया था, क्योंकि पुराने काम अभी भी उनके स्थानीय भंडार में मौजूद हैं। –

+0

अगर रिमोट साफ़ किया गया है, तो उन्हें फिर से क्लोन करें। –

+0

मुझे पता है कि मैं इसे फिर से क्लोन करने के बजाय एक और तरीका ढूंढ रहा हूं। –

0

प्रोजेक्ट पुस्तक का git filter-branch (अन्य पोस्ट उल्लेखों के रूप में फ़िल्टर-पेड़ नहीं) का उपयोग करके एक विस्तृत उदाहरण है। अध्याय मैं नहीं दिख रहा है कि वे किस तरह विशाल वस्तु का परिचय देंगे अगर वे फिर से धक्का यहाँ

'निकाला जा रहा है वस्तुओं' http://progit.org/book/ch9-7.html

+0

progit किताब में गाइड की शुरुआत में ही है http://help.github.com/removing-sensitive-data/ रूप में ही है –

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