আমি কীভাবে গিট টানকে প্রতিটি টানে সমস্ত কিছু ওভাররাইট করতে বাধ্য করি?


203

আমার কাছে একটি সেন্ট্রাল বেয়ার রিপোজিটরি রয়েছে যাতে তিনটি বিকাশকারী সংগ্রহস্থল এটিকে সাধারনত টানতে এবং ধাক্কা দিয়ে থাকে।

আমার আরও দুটি সংগ্রহস্থল রয়েছে যা সেন্ট্রাল বেয়ার রেপো থেকে টানা: একটি লাইভ সার্ভার এবং অন্যটি পরীক্ষা / পর্যায়ের সার্ভার। প্রত্যেকটি তার নিজস্ব শাখা থেকে টানছে।

দৃশ্যটি হ'ল: post-updateসেন্ট্রাল রেপোতে আমার একটি হুক স্ক্রিপ্ট রয়েছে যা স্বয়ংক্রিয়ভাবে পরীক্ষার এবং লাইভ রেপোগুলিতে অ্যাক্সেস করে এবং প্রতিটিটিতে একটি পুল কমান্ড চালায়। কোন শাখায় নতুন কমিট রয়েছে তার উপর নির্ভর করে এটি পরীক্ষা এবং লাইভ সার্ভার উভয়ই আপডেট করে। এই সব দুর্দান্ত কাজ করে।

সমস্যাটি হ'ল: জরুরী পরিস্থিতিতে এমন অনেক সময় থাকতে পারে যে ফাইলগুলি সরাসরি সার্ভারে আপডেট করা হতে পারে (ftp বা যে কোনও মাধ্যমে) এবং সেন্ট্রাল পোস্ট-আপডেট স্ক্রিপ্টটি ব্যর্থ হবে যেহেতু মার্জ / ওভাররাইট সংঘাত দেখা দেবে। এই দৃশ্যটি এড়ানোর কোনও উপায় নেই এবং এটি অনিবার্য।

আমি যা হতে চাই তা হ'ল: আমি চাই লাইভ এবং টেস্ট সাইটগুলি থেকে টানটি সর্বদা ওভাররাইট / টানতে একত্রীকরণ করা হোক। সর্বদা. এই repos কেবল টান হবে কারণ তারা উন্নয়নের জন্য নয়।

আমার সমস্ত গবেষণায়, আমি সর্বদা স্থানীয় ফাইলগুলিকে একটি ওভাররাইটে চাপ দেওয়ার জন্য একটি ভাল সমাধান খুঁজে পাই না । এটা কি আদৌ সম্ভব? এটি যদি একটি দুর্দান্ত বিকাশের দৃশ্যপট তৈরি করে।


1
আমি নীচে 'আপনি যা কিছু পেয়েছেন তার পুনরায় সেট করার' জন্য নীচে আমি ভোট দিয়েছি বলে আমি মনে করি আপনার আসল সমস্যার সমাধানটি ব্যান্ড-আউট পরিবর্তন না করা। পরিবর্তনগুলি, যত তাড়াতাড়ি জরুরি হোক না কেন, সর্বদা সংস্করণ নিয়ন্ত্রণের মধ্য দিয়ে যাওয়া উচিত । অপারেটর ব্যতীত কারও চলমান সাইটগুলিতে সরাসরি অ্যাক্সেস করা উচিত নয় (যেমন বিকাশকারী নয়)। ধারাবাহিকভাবে সংস্করণ নিয়ন্ত্রণ ব্যবহারের অর্থ হ'ল পরিবর্তনগুলি কখন করা হয়েছিল এবং কে এগুলি তৈরি করেছে এবং সেগুলির সাথে কাজ করার জন্য আরও ভাল সরঞ্জামগুলি আপনার কাছে রেকর্ড রয়েছে। সত্যিকারের কোন লাভের জন্য কেন এটিকে বিকৃত করবেন?
ফিল মিলার

1
@ নভেলোক্র্যাট ঠিক আছে, আপনি কী বলছেন তা আমি বুঝতে পেরেছি। দুর্ভাগ্যক্রমে, এমন অনেক পরিস্থিতিতে আছে যেখানে কেউ সরাসরি ফাইল সার্ভারে আপলোড করতে পারে। সেক্ষেত্রে আমার পুনরায় সিঙ্ক করার জন্য বেশ কয়েকটি কমান্ড চালাতে হবে। পূর্বে আমরা রেপো থেকে সার্ভারে ফাইলগুলি সরানোর জন্য একটি এফটিপি স্ক্রিপ্ট ব্যবহার করি। উপরের প্রস্তাবিত পদ্ধতিটি কেবল এফটিপি পদক্ষেপটি সরিয়ে ফেলবে, যা অতীতে খুব ভাল কাজ করেছে।
বিমাইলস্পে

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
@ নিকমিতলউইক আমি চিন্তিত ছিলাম git clean -dfগিটিংগর্ড ফাইলগুলিও সরিয়ে ফেলবে, তবে দেখা যাচ্ছে এটি হবে না। git clean --help"সাধারণত, গিটের অজানা ফাইলগুলি সরিয়ে ফেলা হয়, তবে -x বিকল্পটি নির্দিষ্ট করা থাকলে, উপেক্ষা করা ফাইলগুলিও সরানো হবে This উদাহরণস্বরূপ, সমস্ত বিল্ড পণ্য মুছে ফেলার জন্য এটি কার্যকর হতে পারে।"
নিকং 2


6

এটি একটি কমান্ডে কীভাবে করবেন তা সম্পর্কে আমি নিশ্চিত নই তবে আপনি এর মতো কিছু করতে পারেন:

git reset --hard
git pull

অথবা এমনকি

git stash
git pull

আর মাত্র একটি কমান্ড চালানোর জন্য: git reset --hard && git pull। বিকল্পভাবে, তবে আরও ভাল নয় git reset --hard; git pull,। &&প্রথম কমান্ডটি সফল হলে কেবল দ্বিতীয় আদেশটি ব্যবহার করা হবে। ;প্রথম কমান্ডের প্রস্থান কোড নির্বিশেষে এটিকে চালিত করবে।
mazunki

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
আমি মনে করি যে এক্সটি সমস্ত চিহ্নবিহীন ফাইলগুলি সরিয়ে ফেলবে। ম্যানপেজ-স্পিকারে বলা মুশকিল, যার জন্য আমাদের এসও আছে।
জোসেফকে

2
@ জোসেফকে: এটি ভুল। এর মূল উদ্দেশ্যটি git cleanইতিমধ্যে "কার্যকারী গাছ থেকে অনতিযুক্ত ফাইলগুলি সরান" (পৃষ্ঠার শীর্ষে)। সাধারণত, এটি উপেক্ষা করা ফাইলগুলিকে অন্তর্ভুক্ত করে না, তবে উপেক্ষা করা ফাইলগুলিকেও অন্তর্ভুক্ত করতে -xবলেছে git clean(এটি বাদে -eবিকল্পগুলির দ্বারা উপেক্ষা করা ফাইলগুলিকে প্রভাবিত করে না )।
ডায়েটারিচ এপ্প

2

আপনি যদি শেষ টান / ক্লোন থেকে এখনও স্থানীয় পরিবর্তনগুলি না করেন তবে আপনি এটি ব্যবহার করতে পারেন:

git checkout *
git pull

checkoutসর্বশেষ স্থানীয় প্রতিশ্রুতি দিয়ে আপনার স্থানীয় পরিবর্তনগুলি pullসাফ করে দেবে এবং এটিকে দূরবর্তী সংগ্রহস্থলে সংশ্লেষ করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.