2010-01-18 13 views
37

फिर भी मुझे गिट इतिहास रीराइट फीचर पसंद है, फिर भी इतिहास को सुनिश्चित करने के बारे में कोई कैसे लिखा जाता है।गिट इतिहास को रोकने या पकड़ने के लिए रणनीति

हमें कोई फर्क नहीं पड़ता कि प्रोग्रामर अपनी मशीन पर क्या करता है, लेकिन हमें यह सुनिश्चित करने की ज़रूरत है कि इतिहास को इतिहास में परिवर्तित नहीं किया गया है।

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

उत्तर

38

आप चला सकते हैं, तो:

git config --system receive.denyNonFastforwards true 
सर्वर पर

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

git config:

receive.denyNonFastForwards

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

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


रूप ebneter (जो एक सुसंगत भंडार के महत्व को जानता है - SVN to Git migrations के बारे में जवाब देखने के [सवाल अब नष्ट कर दिया, 10K + उपयोगकर्ताओं को केवल]) टिप्पणियाँ:

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

git config: उपयोगकर्ता शाखा नष्ट करने के लिए और फिर इसे वापस धक्का नया संदर्भ के साथ के लिए

denyNonFastForwards नीति के समाधान में से एक है। Git के नए संस्करण में (संस्करण 1.6.1 के साथ शुरुआत), आप सत्य पर receive.denyDeletes सेट कर सकते हैं:

$ git config --system receive.denyDeletes true

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

+4

नोट: गिट 1.6 या केवल नए ... – VonC

+6

आप शायद प्राप्त कर सकते हैं .denyDeletes सच है क्योंकि अन्यथा, कोई भी शाखा को हटा सकता है और फिर अपने पुनर्लेखन को एक नई शाखा के रूप में धक्का दे सकता है, प्रभावी रूप से इतिहास को फिर से लिखना। – ebneter

+0

@ एबनेटर: महान टिप। मैंने इसे शामिल करने के लिए अपना जवाब संपादित किया है। धन्यवाद। – VonC

3

आप receive.denyNonFastForwards के लिए एक नया पर्याप्त Git उपयोग नहीं कर रहे हैं, तो आप के माध्यम से {pre,post}-receive (दूसरों के बीच) सर्वर, जो विशिष्ट शाखाओं और इसके आगे के लिए एक छोटा सा में अधिक स्पष्टता की अनुमति देता है पर हुक नीति को लागू कर सकते हैं। (एक पर रोक लगाने इतिहास पुनर्लेखन सहित)

कुछ अच्छे उदाहरण वहाँ खजाने के सभी प्रबंधित करने के लिए सूक्ति परियोजना द्वारा किया जाता है:

https://git.gnome.org/browse/sysadmin-bin/tree/git

मैं pre-receive-check-policy पर विशेष रूप से देखने के लिए चाहते हैं।

0

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

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