मैं हर पुल पर सब कुछ अधिलेखित करने के लिए कैसे पुल खींच बल?


203

मेरे पास CENTRAL नंगे रिपॉजिटरी है जिसमें तीन डेवलपर रिपॉजिटरी हैं जो सामान्य रूप से इसे खींचते और धकेलते हैं।

मेरे पास दो अन्य रिपॉजिटरी भी हैं जो सेंट्रल नंगे रेपो से खींचते हैं: एक लाइव सर्वर है, और दूसरा एक टेस्ट / स्टेज सर्वर है - प्रत्येक अपनी संबंधित शाखा से खींच रहा है।

परिदृश्य यह है: मेरे पास post-updateCENTRAL रेपो पर एक हुक स्क्रिप्ट है जो स्वचालित रूप से परीक्षण और लाइव रिपोज को एक्सेस करता है और प्रत्येक पर एक पुल कमांड चलाता है। यह परीक्षण और लाइव सर्वर दोनों को अपडेट करता है, यह सब इस बात पर निर्भर करता है कि नई शाखा में क्या है। यह सब बहुत अच्छा काम करता है।

समस्या यह है: एक आपात स्थिति में कई बार हो सकता है कि फाइलें सर्वर पर सीधे अपडेट की जा सकती हैं (ftp या जो भी हो) और CENTRAL पोस्ट-अपडेट स्क्रिप्ट तब विफल हो जाएगी, जब मर्ज / ओवरराइट का विरोध होगा। इस परिदृश्य से बचने का कोई तरीका नहीं है, और यह अपरिहार्य है।

मैं जो होना चाहूंगा वह यह है: मैं चाहता हूं कि लाइव और परीक्षण साइटों से हमेशा खींच को अधिलेखित / विलय करें। हमेशा। ये रिपॉजिट पुल-ओनली होंगे क्योंकि ये विकास के लिए नहीं हैं।

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


1
जब मैंने नीचे दिए गए 'रीसेट टू व्हाट यू लाइक व्हाट्सएप' के लिए वोट किया है, तो मुझे लगता है कि आपकी वास्तविक समस्या का समाधान आउट-ऑफ-बैंड परिवर्तन नहीं करना है। संशोधन, चाहे कितना जरूरी हो, हमेशा संस्करण नियंत्रण के माध्यम से जाना चाहिए । ऑपरेटरों को छोड़कर किसी को भी चलने वाली साइटों (जैसे डेवलपर्स नहीं) तक सीधी पहुंच होनी चाहिए। संस्करण नियंत्रण का लगातार उपयोग करने का मतलब है कि आपके पास रिकॉर्ड है कि कब बदलाव किए गए थे, और उन्हें किसने बनाया था, और उनके साथ काम करने के लिए बेहतर उपकरण। कोई वास्तविक लाभ के लिए, इसे क्यों हटा दें?
फिल मिलर

1
@ नोवेलक्रेट सही, मैं समझता हूं कि आप क्या कह रहे हैं। दुर्भाग्य से, ऐसे कई परिदृश्य हैं जहां कोई व्यक्ति सीधे सर्वर पर फ़ाइल अपलोड कर सकता है। उस स्थिति में मुझे रेपो को पुन: सिंक करने के लिए कई कमांड चलाने की आवश्यकता होगी। पहले हमने रेपो से सर्वर पर फ़ाइलों को स्थानांतरित करने के लिए एक एफ़टीपी स्क्रिप्ट का उपयोग किया था। ऊपर प्रस्तावित विधि बस एफ़टीपी कदम को समाप्त कर देगी, जिसने अतीत में बहुत अच्छा काम किया है।
bmilesp

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

जवाबों:


510

वास्तव में ऐसा करने का आदर्श तरीका यह है कि इसका उपयोग बिल्कुल न किया जाए pull, बल्कि इसके बजाय fetchऔर reset:

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df

( masterआप जिस भी शाखा में जाना चाहते हैं, उसके लिए अलर्ट करना।)

pullकिसी तरह से एक साथ विलय के बदलावों के resetलिए डिज़ाइन किया गया है , जबकि आपके स्थानीय कॉपी मैच को एक विशिष्ट प्रतिबद्धता बनाने के चारों ओर डिज़ाइन किया गया है।

आप cleanअपने सिस्टम की जरूरतों के आधार पर कुछ अलग विकल्पों पर विचार कर सकते हैं।


3
@ user730569 reset --hardएक कमांड है जिसका उपयोग किसी विशेष प्रतिबद्ध के मिलान वाले राज्य की कार्यशील निर्देशिका (और वर्तमान शाखा) को बाध्य करने के लिए किया जाता है।
अंबर

25
FETCH_HEADएक संदर्भ है जो स्वचालित रूप से तैयार fetchरेफरी को दर्शाने के लिए बनाया जाता है। जब भी आप एक भ्रूण लाते हैं तो यह विलय नहीं होता है, बस सीधे-सीधे ओवरराइट किया जाता है। cleanएक ऐसी कमांड है जो उन फ़ाइलों को हटाती है जिन्हें ट्रैक नहीं किया जाता है git, -dfझंडे इसे निर्देशिका को हटाने के लिए कहते हैं ( -d) और वास्तव में निष्कासन ( -f) करते हैं।
अंबर

4
इसके लिए कोई कीवर्ड क्यों नहीं है? मुझे पुल की तुलना में बहुत अधिक बार इसकी आवश्यकता है।
वोल्फगैंग फाहल

14
आप उपयोग करने git clean -dnसे पहले उपयोग करना चाह सकते हैं git clean -dfताकि आप देखेंगे कि कौन सी फाइलें / फ़ोल्डर हटा दिए जाएंगे। git clean -dfकेवल उलटा हो सकता है यदि आपके पास बैकअप था
इब्राहिम लवाल

1
@NickMiddleweek मैं चिंतित था कि git clean -dfgitignored फ़ाइलों को भी हटा दूंगा, लेकिन यह नहीं होगा। git clean --helpकहते हैं, "आम तौर पर, Git के लिए केवल अज्ञात फ़ाइलें हटा दी जाती हैं, लेकिन अगर -x विकल्प निर्दिष्ट किया जाता है, तो उपेक्षित फ़ाइलों को भी हटा दिया जाता है। उदाहरण के लिए, सभी बिल्ड उत्पादों को हटाने के लिए उपयोगी हो सकता है।"
निकंग 24'17


6

मुझे यकीन नहीं है कि इसे एक कमांड में कैसे किया जाए लेकिन आप कुछ ऐसा कर सकते हैं:

git reset --hard
git pull

या और भी

git stash
git pull

एक कमांड में चलाने के लिए git reset --hard && git pull:। वैकल्पिक रूप से, लेकिन बेहतर नहीं, git reset --hard; git pull&&यदि पहली कमांड सक्सेसफुल होती तो केवल दूसरी कमांड का उपयोग करना । ;पहले आदेश के निकास कोड की परवाह किए बिना इसे चलाएगा।
माज़ुन्की

5

मूल उपयोग से स्थानीय फ़ाइलों की शाखा और बल अधिलेखित करने के लिए एक प्रति खींचने के लिए:

git reset --hard origin/current_branch

सभी वर्तमान कार्य खो जाएंगे और यह मूल शाखा के समान होगा



2

आप सब कुछ साफ करने के लिए हुक को बदल सकते हैं।

# Danger! Wipes local data!

# Remove all local changes to tracked files
git reset --hard HEAD

# Remove all untracked files and directories
git clean -dfx

git pull ...

2
एक्स क्या करता है? कृपया स्विच समझाएं
स्टीव के

2
मुझे लगता है कि x सभी असंबंधित फ़ाइलों को हटाने वाला है। मैनपेज-बोलने में मुश्किल है, यही वजह है कि हमारे पास एसओ है।
जोसेफ

2
@ जोसेफ: यह गलत है। का मूल उद्देश्य git cleanपहले से ही "काम कर रहे पेड़ से अनट्रैक की गई फ़ाइलों को हटा दें" (पृष्ठ के ऊपर)। आम तौर पर, इसमें उपेक्षित फ़ाइलों को शामिल नहीं किया जाता है, लेकिन उपेक्षित फ़ाइलों को भी शामिल करना -xबताता git cleanहै (इसके अलावा यह -eविकल्प द्वारा अनदेखी की गई फ़ाइलों को प्रभावित नहीं करता है)।
डायट्रिच एप्प जूल

2

यदि आपने पिछले पुल / क्लोन के बाद से अभी तक स्थानीय परिवर्तन नहीं किए हैं, तो आप उपयोग कर सकते हैं:

git checkout *
git pull

checkoutअंतिम स्थानीय कमिट के साथ आपके स्थानीय बदलावों को स्पष्ट करेगा, और pullदूरस्थ रिपॉजिटरी में इसका पता लगाएगा

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