একটি আলাদা নাম এবং পথ সহ কোনও ফাইলে একটি গিট প্যাচ কীভাবে প্রয়োগ করবেন?


106

আমার দুটি সংগ্রহশালা রয়েছে। একটিতে আমি ফাইলটিতে পরিবর্তন আনছি ./hello.test। আমি পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করি এবং সেই প্রতিশ্রুতি থেকে একটি প্যাচ তৈরি করি git format-patch -1 HEAD। এখন আমি একটি দ্বিতীয় সংগ্রহস্থলের যে hello.test হিসাবে একই বিষয়বস্তু রয়েছে কিন্তু ভিন্ন নামে একটি ভিন্ন ডিরেক্টরির মধ্যে স্থাপন করা হয় যে একটি ফাইল আছে আছে: ./blue/red/hi.test। আমি কীভাবে hi.testফাইলটিতে পূর্বোক্ত প্যাচ প্রয়োগ করব ? আমি চেষ্টা করেছিলাম git am --directory='blue/red' < patch_fileকিন্তু অবশ্যই অভিযোগ করে যে ফাইলগুলির নাম একই নেই (যা আমি ভেবেছিলাম গিটের যত্ন নেই?)। আমি জানি যে আমি সম্ভবত সেই নির্দিষ্ট ফাইলটিতে প্রয়োগ করতে পার্থক্য সম্পাদনা করতে পারি তবে আমি একটি কমান্ড সমাধান খুঁজছি।


উত্তর:


103

আপনি প্যাচটি ব্যবহার করে তৈরি করতে পারেন git diffএবং তারপরে patchইউটিলিটিটি ব্যবহার করে এটি প্রয়োগ করতে পারেন , যা আপনাকে যে ফাইলটি পৃথক করতে চান সেটি নির্দিষ্ট করতে দেয়।

উদাহরণ স্বরূপ:

cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file

cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file

7
আহ, সুন্দর, এটা ভাবিনি। যাইহোক, গিট কমান্ডগুলির সাথে এটি করার কোনও উপায় কী যাতে ডেটা কমিট করে (তারিখ এবং সময়, লেখককে প্রতিশ্রুতিবদ্ধ, কমিট বার্তা) একই রাখে?
mart1n

4
এটি সম্ভব যে আপনি কিছু করতে amবা করতে পারেন applyতবে আমি এটি খুঁজে পাই না। আপনি যদি নিজেকে অনেকগুলি সদৃশ পরিবর্তনগুলি দেখতে পান তবে সাবমডিউলগুলি ব্যবহার করে আরও ভাল সমাধান হতে পারে বা আপনার পছন্দের ভাষাটি কোড ভাগ করার জন্য যা কিছু সরবরাহ করে (যেমন রুবিতে আপনি রত্ন হিসাবে নকল কোডটি বের করতে পারেন)।
জর্জেব্রক

4
এটি আসলে ডকুমেন্টেশন সম্পর্কিত (উত্স ফাইলগুলি এক্সএমএল)। সাবমডিউলগুলি সত্যই কোনও বিকল্প নয় কারণ আমার বিদ্যমান অবকাঠামোতে তাদের জন্য আমার একটি শক্ত মামলা তৈরি করতে হবে।
mart1n

56

একটি সহজ সমাধান রয়েছে যা ম্যানুয়াল প্যাচ সম্পাদনা বা বাহ্যিক স্ক্রিপ্টকে জড়িত করে না।

প্রথম ভাণ্ডারে (এটি একটি প্রতিশ্রুতিও রপ্তানি করতে পারে, -1আপনি কেবল একটি প্রতিশ্রুতি নির্বাচন করতে চাইলে ব্যবহার করুন):

git format-patch --relative <committish> --stdout > ~/patch

দ্বিতীয় ভাণ্ডারে:

git am --directory blue/red/ ~/patch

ব্যবহার --relativeনা করে git format-patch, আরেকটি সমাধান হ'ল প্যাচগুলির পথ থেকে ডিরেক্টরিগুলি ফ্রি করার -p<n>বিকল্পটি ব্যবহার করা , যেমনটি একই প্রশ্নের উত্তরে উল্লিখিত হয়েছে ।git amn

এটি git format-patch --relative <committish>ছাড়া চালানোও সম্ভব --stdoutএবং এটি .patchফাইলগুলির একটি সেট তৈরি করে। এই ফাইলগুলি তখন সরাসরি খাওয়ানো যেতে পারে git amসঙ্গে git am --directory blue/red/ path/to/*.patch


9
এটি এখনও নির্ভর করে যে ফাইলের নাম একই, তাই না?
mart1n

4
লক্ষ্য করা উচিত যে --directoryবিকল্পটির জন্য আপনাকে রেপো রুটের সাথে সম্পর্কিত ডিরেক্টরিটির পুরো পথ নির্দিষ্ট করতে হবে; --directory=./রেডোতে একটি উপ-ডিরেক্টরিতে chdir'd কাজ করার সময় কিছু কাজ করবে না।
রিড

4
এর --3wayসাহায্যে does not exist in indexgit am --3way --directory (relative-path) (patch)
সহায়তাগুলি

-kপ্রতিশ্রুতি বার্তার প্রথম লাইনটি না ছড়িয়ে দিতে উভয় আদেশে কী ব্যবহার করুন ।
রুভিম

--3way"ইনডেক্সে অস্তিত্ব নেই" ত্রুটিগুলি (@ নোবার দ্বারা নির্দেশিত হিসাবে) কেবল না শুধুমাত্র ব্যবহার সাহায্য করে, তবে আপনাকে মার্জ সংঘাতগুলি পরিষ্কারভাবে পরিচালনা করতে দেয় allows দ্বন্দ্বযুক্ত ফাইলগুলি ছোঁয়া ছাড়ার পরিবর্তে, একটি সংঘাতের ব্লক যুক্ত করা হয়েছে যা এর পরে সমাধান করা যেতে পারে।
ড্যানিয়েল ওল্ফ

12

আমার নিজের প্রশ্নের উত্তর একটি স্ক্রিপ্টের সাথে দেওয়া যা কেবল এটি করে: https://github.com/mprpic/apply-patch-to-file

প্যাচ ফাইলটি ম্যানুয়ালি সংশোধন করার পরিবর্তে এটি ব্যবহারকারীকে টার্গেট ফাইলের জন্য অনুরোধ করে, প্যাচটি সংশোধন করে এবং আপনি বর্তমানে যে রেপোতে রয়েছেন তা প্রয়োগ করে।


5

@ জর্জব্রোকের উত্তরের উপর ভিত্তি করে তৈরি করা, আমি এখানে একটি সমাধান ব্যবহার করেছি:

প্রথমে প্যাচ ফাইলগুলি যথারীতি তৈরি করুন (উদাঃ) git format-patch commitA..commitB )।

তারপরে নিশ্চিত হয়ে নিন যে আপনার টার্গেটের সংগ্রহস্থল পরিষ্কার আছে (কোনও পরিবর্তিত বা চিহ্নবিহীন ফাইল থাকা উচিত নয়) এবং এই জাতীয় প্যাচগুলি প্রয়োগ করুন:

cd second-repo
git am ~/00*.patch

প্রতিটি প্যাচ ফাইলের জন্য আপনি "ত্রুটি: এক্সওয়াইজেড সূচীতে উপস্থিত নেই" এর মতো একটি ত্রুটি পাবেন। আপনি এখন এই প্যাচ ফাইলটি ম্যানুয়ালি প্রয়োগ করতে পারেন:

patch --directory blue/red < ~/0001-*.patch
git add -a
git am --continue

প্রতিটি প্যাচ ফাইলের জন্য আপনাকে এই তিনটি পদক্ষেপ করতে হবে।

এটি কোনও বিশেষ git format-patchআদেশ বা প্যাচ ফাইলগুলি সম্পাদনা না করে মূল প্রতিশ্রুতি বার্তা ইত্যাদি সংরক্ষণ করবে etc.


4
উত্তম উত্তর, আমি মনে করি এটি কোনও প্রকারের "অ-মানক" প্যাচ ম্যানিপুলেশনের সেরা ভিত্তি। আমি এটি 3 পদক্ষেপে করি। (1) পাঠ্য প্রতিশ্রুতিবদ্ধ - git format-patch -1 commitA --stdout > thing.diff; (২) প্যাচ ফাইলটি সম্পাদনা করুন যতক্ষণ না এটি আমার যা প্রয়োজন তা করবে; (৩) প্রতিশ্রুতিবদ্ধ পাঠ্য git am --3way thing.diff যার ফলে আপনি এই প্যাচের যে অংশগুলি পরিষ্কারভাবে প্রয়োগ করতে পারেন সেগুলি গ্রহণ করতে পারবেন এবং যে অংশগুলি নেই তার gitজন্য স্ট্যান্ডার্ড দ্বন্দ্বের সমাধান প্রক্রিয়াটি ব্যবহার করুন।
আমরা সমস্ত মনিকা

2

আমি বুঝতে পারি যে দুটি ফাইল আপনার পরিস্থিতিতে ঠিক একই রকম, সুতরাং প্যাচটি সফল হওয়ার সম্ভাবনা রয়েছে।

যাহোক, আপনি যদি একই ধরণের কোনও প্যাচ প্রয়োগ করতে চান তবে ঠিক একই ফাইলটি নয় বা আপনি একটি ইন্টারেক্টিভ প্যাচিং করতে চান তবে আপনি তিনটি উপায় একত্রিত করতে পারবেন।

আপনার কাছে সেই ফাইলে রুপান্তরিত বলুন A, এর যাক বোঝাতে A~1পূর্ববর্তী সংস্করণ হিসেবে ও আপনার মধ্যে পরিবর্তন প্রয়োগ করতে চান A~1করতে Aফাইলে B

একটি ত্রি উপায় একত্রীকরণ সরঞ্জাম খুলুন, উদাহরণস্বরূপ তুলনার বাইরে, বাম প্যানেলের পাথ A, মধ্য প্যানেলটি সাধারণ পূর্বপুরুষ তাই A~1পথটি, ডান প্যানেলের পথ B। তারপর, নিম্ন প্যানেলের শো মধ্যে পরিবর্তন প্রয়োগের ফলাফলের A~1জন্য Aফাইলে B

নিম্নলিখিত চিত্রটি ধারণাটি চিত্রিত করে।

এখানে চিত্র বর্ণনা লিখুন


0

এফওয়াইআই: আমি সম্প্রতি গিথুব থেকে একটি প্যাচ ডাউনলোড করার চেষ্টা করে এবং এটি একটি স্থানীয় ফাইলে প্রয়োগ করার ক্ষেত্রে সমস্যা ছিল (এটি একটি নতুন জায়গায় "ওভাররাইড" ছিল)।

git amপ্যাচটি প্রয়োগ করবে না কারণ ফাইলটি "ইনডেক্সে নেই" বা "নোংরা"। তবে, আমি দেখতে পেলাম যে সহজ patchকমান্ডটি প্যাচটি প্রয়োগ করতে পারে। এটি ফাইলের নামটি প্যাচ করার জন্য আমাকে অনুরোধ করেছিল।

কাজ শেষ হয়েছে, যাইহোক ...

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