একটি নির্দিষ্ট কমিটের জন্য গিট প্যাচ কীভাবে তৈরি করা যায়?


1231

আমাকে এমন একটি স্ক্রিপ্ট লিখতে হবে যা SHA1 কমিট সংখ্যার তালিকার জন্য প্যাচ তৈরি করে।

আমি ব্যবহার করার চেষ্টা করেছি git format-patch <the SHA1>, কিন্তু এটি সেই SHA1 সাল থেকে প্রতিটি প্রতিশ্রুতির জন্য একটি প্যাচ তৈরি করেছে। কয়েক শতাধিক প্যাচ তৈরি হওয়ার পরে, আমাকে প্রক্রিয়াটি শেষ করতে হয়েছিল।

কেবলমাত্র SHA1 এর জন্য কোনও প্যাচ তৈরির উপায় আছে?

উত্তর:


1989

চেষ্টা করুন:

git format-patch -1 <sha>

অথবা

git format-patch -1 HEAD

উপরের ডকুমেন্টেশন লিঙ্ক অনুসারে, -1পতাকাটি গিটকে জানায় যে প্যাচটিতে কয়টি কমিটস অন্তর্ভুক্ত করা উচিত;

- <এন>

     শীর্ষস্থানীয় কমিটিগুলি থেকে প্যাচগুলি প্রস্তুত করুন।


কমান্ডটি সহ প্যাচটি প্রয়োগ করুন:

git am < file.patch

210
প্যাচ প্রয়োগ করা হচ্ছে: git apply --stat file.patch# পরিসংখ্যান প্রদর্শন করুন। git apply --check file.patch# আবেদনের আগে ত্রুটি পরীক্ষা করুন। git am < file.patch# প্যাচটি অবশেষে প্রয়োগ করুন।
অ্যাড্রিয়ান

3
শেষ প্রতিশ্রুতি অন্য কোনও শাখা থেকে একত্রিত হলে এটি কাজ করবে বলে মনে হয় না।
লেক্স লি

2
git am --keep-cr < mypatch.patch
সিআরএলএফ

40
git am -3 < file.patchএকটি ত্রি-মুখী মার্জ ব্যবহার করে প্রয়োগ করতে ব্যবহার করুন যা আপনাকে এখানে খুঁজে পাওয়াgit mergetool পরে (বা ম্যানুয়ালি সম্পাদনা করে) বিবাদগুলি সমাধান করতে দেবে ।
ম্যাট

6
এই কমান্ডটি কমিট থেকে কেবল একটি নির্দিষ্ট ফাইল (গুলি) এর জন্যও কাজ করে: git format-patch -1 <sha> path/to/file.jsএটি কেবলমাত্র ফাইল.জেএস এর জন্য পৃথকীকরণযুক্ত একটি প্যাচ তৈরি করবে
ক্রিস্টফ

281

শীর্ষস্থান থেকে প্যাচগুলি উত্পন্ন করার জন্য নির্দিষ্ট sha1 হ্যাশ থেকে কমিট করে:

git format-patch -<n> <SHA1>

একক প্যাচ ফাইলে মাথা থেকে শেষ 10 টি প্যাচ:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

2
প্রথম কমান্ডের জন্য উদাহরণ দেওয়ার জন্য আপনি কি দয়া করে যথেষ্ট দয়া করতে পারেন
কাসুন সায়াম্বলাপিতিয়া

1
git format-patch -1 HEADসর্বাধিক সাম্প্রতিক কমিটের জন্য প্যাচ তৈরি করবে
শ্রীরাম মুরালি

1
আমাকে এই জিজ্ঞাসা করার জন্য ক্ষমা করুন, সুতরাং এটি যখন -2সর্বাধিক সাম্প্রতিক ২ টি কমিটের জন্য প্যাচ তৈরি করে তা হ'ল এবং স্পষ্টির জন্য আরও একটি বিষয় হ'ল আদেশটি got format-patch -2 HEADলাইনটির সমানgit format-patch HEAD~2
কাসুন সায়াম্বলাপিতীয়

85

বলুন যে আপনি প্রতিশ্রুতি 1 পরে আইডি 2 করেছেন আপনি চালাতে সক্ষম হবেন:

git diff 2 1 > mypatch.diff

যেখানে 2 এবং 1 টি হ'ল হ্যাশ।


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

11
@elle, না, আপনি না - git diff hash^ hash। "হ্যাশ ^" পূর্ববর্তী প্রতিশ্রুতি দেয়। (তবে, অবশ্যই, মনোজल्डস এর উত্তর আরও ভাল)
J-16 SDiZ

2
git show HEAD > mypatch.diffআপনি যখন প্রতিশ্রুতিবদ্ধ তখন একই কাজ করা উচিত।
andho

1
@dookehester, এটি সঠিক কিনা বা এটি অন্যান্য উপায়git diff 1 2
Kasun Siyambalapitiya

1
এটি ডিফের মধ্যে কোনও বাইনারি ফাইল অন্তর্ভুক্ত করতে ব্যর্থ হবে।
আটকে

55

এই আদেশটি (ইতিমধ্যে @ নাফতুলি তজভি কে'র পরামর্শ অনুসারে ):

git format-patch -1 HEAD

HEADনির্দিষ্ট হ্যাশ বা ব্যাপ্তি দিয়ে প্রতিস্থাপন করুন ।

ইউনিক্স মেলবক্স ফর্ম্যাটটির অনুরূপ হতে সর্বশেষ প্রতিশ্রুতিবদ্ধ ফর্ম্যাটটির জন্য প্যাচ ফাইল তৈরি করবে gene

-<n> - শীর্ষস্থানীয় কমিটিগুলি থেকে প্যাচগুলি প্রস্তুত করুন।

তারপরে আপনি কোনও মেলবক্স ফর্ম্যাটে প্যাচ ফাইলটি পুনরায় প্রয়োগ করতে পারেন:

git am -3k 001*.patch

দেখুন: man git-format-patch


ধন্যবাদ! আমি মনে করি যে এটি প্যাচ প্রয়োগ করা [PATCH] এর উপসর্গযুক্ত প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি সহ একটি অঙ্গীকার তৈরি করবে। তবে এটি ঠিক করা সহজ
মাইক এস

2
বিষ্ময়কর। ওপি, আপনি এটি গ্রহণ করেন নি, কারণ ...? @ মাইকস না, এটি অন্য কোনও gitফর্ম্যাটযুক্ত প্যাচের চেয়ে বেশি নয়, যদি ব্যবহারকারী এটি সঠিকভাবে প্রয়োগ করে।
আন্ডারস্কোর_২

2
@ মাইকস আমি কেন সত্যই তা তদন্ত করিনি, তবে -kপতাকাটি রেখে ( git am -3) এই ফর্মটি আমাকে স্থির করেছে (কোনও PATCH[0/10]প্রতিশ্রুতি বার্তা নেই)। গিট সংস্করণ 2.20.1.windows.1
জান্নিস

30
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

দ্রুত এবং সহজ সমাধান।


5
এছাড়াও git apply --check patch-file-nameপ্যাচ প্রয়োগের আগে কল করতে ভুলবেন না । এটি সমস্যা এড়াতে সহায়তা করবে।
iamantony

16

আপনি যদি নিশ্চিত হতে চান যে (একক প্রতিশ্রুতি) প্যাচটি একটি নির্দিষ্ট কমিটের উপরে প্রয়োগ করা হবে, আপনি নতুন গিট ২.৯ (জুন ২০১)) বিকল্পটি ব্যবহার করতে পারেন git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

দেখুন কমিট bb52995 , 3de6651 কমিট , কমিট fa2ab86 , কমিট ded2c09 (26 এপ্রিল 2016) দ্বারা Xiaolong তোমরা ( ``)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে 72ce3ff কমিট , 23 মে 2016)

format-patch: --baseবেস ট্রি তথ্য রেকর্ড করতে বিকল্প যোগ করুন '

রক্ষণাবেক্ষণকারী বা তৃতীয় পক্ষের পরীক্ষকরা প্যাচ সিরিজটি সঠিক ভিত্তি গাছের ক্ষেত্রে প্রযোজ্য তা জানতে চাইতে পারেন। গিট ফর্ম্যাট-প্যাচ একটি শিখান--baseবেস ট্রি সম্পর্কিত তথ্য রেকর্ড করার জন্য ' বিকল্পটি এবং এটি প্রথম বার্তাটির শেষে (কভার লেটার বা সিরিজের প্রথম প্যাচ) যুক্ত করুন।

বেস ট্রি তথ্য "বেস কমিট" নিয়ে গঠিত, এটি একটি সুপরিচিত প্রতিশ্রুতি যা প্রকল্পের ইতিহাসের স্থিতিশীল অংশের অংশ অন্য প্রত্যেকে কাজ করে এবং শূন্য বা আরও বেশি "পূর্বশর্ত", যা সুপরিচিত প্যাচগুলি প্রয়োগ করার আগে টপোলজিক্যাল ক্রমে "বেস কমিট" এর শীর্ষে প্রয়োগ করা দরকার এমন "বেস কমিট" এর অংশ নয় এমন ফ্লাইটে থাকা প্যাচগুলি।

"বেস কমিট" base-commit:কমিট অবজেক্ট নামের 40-হেক্স অনুসরণ করে " " হিসাবে প্রদর্শিত হয় ।
একটি "পূর্বশর্ত প্যাচ" prerequisite-patch-id:40-হেক্স "প্যাচ আইডি" এর পরে " " হিসাবে দেখানো হয় , যা git patch-id --stableকমান্ডের মাধ্যমে প্যাচ পাস করে প্রাপ্ত "" হতে পারে ।


গিট 2.23 (Q3 2019) এটির উন্নতি করবে, কারণ " --base" " " বিকল্পটি অস্থির উপায়ের পূর্বশর্ত প্যাচগুলির জন্য format-patchগণনা করেছিল patch-ids, যা " git patch-id --stable" এর সাথে সামঞ্জস্যপূর্ণ এমনভাবে গণনা করার জন্য আপডেট করা হয়েছে ।

প্রতিশ্রুতিবদ্ধ a8f6855 দেখুন , স্টিফেন বয়ড ( ) দ্বারা 6f93d26 (26 এপ্রিল 2019 ) প্রতিশ্রুতিবদ্ধ(দ্বারা একীভূত junio সি Hamano - - মধ্যে কমিট 8202d12 , 13 জুন 2019)akshayka
gitster

format-patch: --base patch-idআউটপুট স্থিতিশীল করা

প্রতিবার আমরা patch-idপ্রজন্মের কোডটিতে কোনও কুঁচকে প্রক্রিয়াজাতকরণের সময় আমরা প্রসঙ্গটি ফ্লাশ করছি না diff.c, তবে আমরা যখন ' patch-id' সরঞ্জামটি দিয়ে "স্থিতিশীল" প্যাচ-আইডি তৈরি করি তখন আমরা তা করছিলাম ।

আসুন বন্দর অনুরূপ যুক্তিবিজ্ঞান থেকে patch-id.cমধ্যে diff.cতাই আমরা একই হ্যাশ পেতে পারেন যখন 'এর জন্য করছি উৎপাদিত প্যাচ-আইডিগুলি format-patch --base=' কম্যান্ড আমন্ত্রণ ধরনের।


গিট 2.24 (Q4 2019) এর আগে " git format-patch -o <outdir>" " mkdir <outdir>" " " নয় " mkdir -p <outdir>" এর সমতুল্য কাজ করেছিল , যা সংশোধন করা হচ্ছে।

দেখুন কমিট edefc31 (11 অক্টোবর 2019) দ্বারা বার্ট Wesarg ( bertwesarg)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট f1afbb0 , 18 অক্টোবর 2019)

format-patch: আউটপুট ডিরেক্টরি এর নেতৃস্থানীয় উপাদান তৈরি

সাইন-অফ-বাই: বার্ট ওয়েসার্গ

'git format-patch -o' 'mkdir' এর সমতুল্য 'mkdir -p' করেনি, যা সংশোধন করা হচ্ছে।

adjust_shared_permসুরক্ষিত প্রভাব থাকতে পারে এমন নেতৃস্থানীয় ডিরেক্টরিতে ' ' এর ব্যবহার এড়িয়ে চলুন । সাময়িকভাবে ' config.sharedRepository' লাইক ' git init' এর অক্ষম করে প্রাপ্ত হয়েছে।


গিট 2.25 (কিউ 12020) সহ, " git rebase" কখন কার্যকর হয়নিformat.useAutoBase কনফিগারেশন ভেরিয়েবল সেট করা থাকলে , যা সংশোধন করা হয়েছে।

দেখুন cae0bc0 কমিট , 945dc55 কমিট , 700e006 কমিট , a749d01 কমিট , কমিট 0c47e06 দ্বারা (04 ডিসেম্বর 2019) ডেন্টন লিউ ( Denton-L)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 71a7de7 , 16 ডিসেম্বর 2019)

rebase: ঠিকঠাক format.useAutoBaseবিরতি

রিপোর্ট-বাই: ক্রিশ্চান বিসিঞ্জার
সাইন-অফ-বাই: ডেন্টন লিউ

এর সাথে format.useAutoBase = true, রিবেস চালানোর ফলে ত্রুটির সৃষ্টি হয়েছিল:

fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.

--no-baseরিবেস থেকে সর্বদা ফরম্যাট-প্যাচে পাস করে এটিকে ঠিক করুন যাতে এর প্রভাবformat.useAutoBase উপেক্ষিত হয়।


8

নির্দিষ্ট প্রতিশ্রুতি (শেষ প্রতিশ্রুতি নয়) থেকে পথ তৈরি করতে:

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

4

যদি আপনি কেবল নির্দিষ্ট ফাইলটি পৃথক করতে চান তবে আপনি এটি করতে পারেন:

গিট ডিফ মাস্টার 766eceb - সংযোগগুলি /> 000-mysql-সংযোজক.প্যাচ


0

আমার পার্থিব ব্যাকগ্রাউন্ডের সাথে আমি ব্যবহার করতে যাচ্ছিলাম:

git log --patch -1 $ID > $file

তবে আমি git format-patch -1 $IDএখন ব্যবহার বিবেচনা করছি ।


-5

কেবলমাত্র নির্দিষ্ট SHA1 এর জন্য কোনও প্যাচ তৈরির উপায় কী?

এটি বেশ সহজ:

বিকল্প 1. git show commitID > myFile.patch

বিকল্প 2। git commitID~1..commitID > myFile.patch

দ্রষ্টব্য: commitIDপ্রকৃত প্রতিশ্রুতি আইডি (SHA1 কমিট কোড) দিয়ে প্রতিস্থাপন করুন ।


3
বিকল্প 1 সঠিকভাবে ভুল এবং প্রশ্নের সাথে সম্পর্কিত নয়।
অঙ্কুশান ম্যানরাল

3
বিকল্প 2ও একটি অবৈধ আদেশ। আপনি এর মতো ত্রুটি পাবেন: গিট a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 ~ 1..a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 গিট: 'a5f4bcaeb7fa7de27ab9e9d97b7eb7eb7eb7eb7eb7eb7eb7eb7eb7eb9eb7eb7eb7eb7eb7eb7eb7eb7e9b9eb7e9b9eb7e9b9eb7eb7eb3e93b97b9e9b9e9b9e9b9e93b9e9b9e93b97b9b9e9b9e9b9e9b9e9bb 'গিট - হেল্প' দেখুন। উত্তর পোস্ট করার আগে
প্লিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.