গিট: এক রেপো দ্বারা প্রতিবেদনের মাধ্যমে অন্য রেপোতে পরিবর্তিত পরিবর্তনগুলি প্রয়োগ করুন


115

আমার একটি repo1এবং repo2লোকাল মেশিন রয়েছে। এগুলি খুব অনুরূপ, তবে পরেরটি হ'ল এক প্রকারের অন্য শাখা ( repo1এটি আর রক্ষণাবেক্ষণ করা হয় না)।

/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X

কিভাবে কমিট দ্বারা তৈরি পরিবর্তনগুলি প্রয়োগ করার জন্য <some_sha>repo1থেকে repo2?

আমার কি কিছু প্যাচ প্রস্তুত করার দরকার আছে, বা cherry-pickরেপোসের মধ্যে কিছু করা সম্ভব ?

একই কাজটি করার ক্ষেত্রে কিন্তু কমিটের পরিসীমা জন্য কীভাবে?


2
আপনি কি repo1 থেকে repo2 এ টানতে পারবেন না?
zwol

কিছুটা সুনির্দিষ্ট ক্ষেত্রে আপনি যেখানে কোনও ফাইল বা ফাইলগুলি যে কোনও সংগ্রহস্থলে স্থানান্তরিত হয়েছিল সেগুলিতে
ব্রাহাম স্নাইডার

উত্তর:


31

হ্যাক হিসাবে, আপনি গিটিপস পৃষ্ঠায় দুটি পৃথক ভাণ্ডারে কমিটের তুলনা করার রেসিপিটি পরিবর্তন করতে চেষ্টা করতে পারেন , যেমন:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \
git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify <commit>)

যেখানে ../repoঅন্য সংগ্রহস্থলের পথ।

আধুনিক গিটের সাহায্যে আপনি চেরি-পিকের সাথে একাধিক সংশোধনী এবং পুনর্বিবেচনার ব্যাপ্তি ব্যবহার করতে পারেন ।

প্রতিশ্রুতিবদ্ধতার SHA-1 সনাক্তকারী হিসাবে $(git --git-dir=../repo/.git rev-parse --verify <commit>) অনুবাদ করার জন্য এখানে <commit>(উদাহরণস্বরূপ HEAD, বা v0.2, বা master~2আপনি যে অনুলিপি করা দ্বিতীয় ভাণ্ডারের মান রয়েছে) to আপনি যে পরিবর্তনটি বেছে নিতে চান তার SHA-1 জেনে থাকলে, এটি প্রয়োজনীয় নয়।

তবে নোট করুন যে গিট উত্স সংগ্রহস্থল থেকে অনুলিপি করা অবজেক্টগুলি এড়িয়ে যেতে পারে, কারণ এটি জানেন না যে কোনও একটি ক্রিয়াকলাপের জন্য বিকল্প অবজেক্টটি কেবল অস্থায়ী। আপনার সাথে দ্বিতীয় সংগ্রহস্থল থেকে জিনিসগুলি অনুলিপি করতে হতে পারে:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f

এটি দ্বিতীয় সংগ্রহস্থল থেকে ধার করা those অবজেক্টগুলিকে মূল সংগ্রহস্থল স্টোরেজে রাখে

পরীক্ষিত না.


একটি খুব হ্যাকি সমাধান না নিটল উত্তর অনুসরণ করা :

  • আপনি যে সম্পাদনাগুলি অনুলিপি করতে চান তা দেখতে চান এবং আপনি যে কমিটগুলি চান তা থেকে প্যাচ তৈরি করে git format-patch
  • Allyচ্ছিকভাবে, আপনার ভাণ্ডারগুলিতে প্যাচগুলি (0001- * ইত্যাদি) অনুলিপি করুন
  • git am --3wayপ্যাচ প্রয়োগ করতে ব্যবহার করুন

1
ভাল কাজ করে। যদি আপনার কমিটমেন্ট নিয়ে সমস্যা হয় তবে 'গিট রিসেট হেড করুন; গিট অ্যাড। '
গুমিক

5
এটি দুর্দান্ত - আপনি কীভাবে একাধিক কমিট করবেন? শুধু sha1 ... sha2?
hvgotcodes

আমিও পেয়েছি fatal: unable to read tree ...তবে git reset HEAD^সবকিছু ঠিকঠাক কাজ করার পরে
jmarceli

@hvgotcodes এটি কেবলমাত্র পরিসীমা পেরিয়ে আমার জন্য কাজ করেছে <commit>তবে rev-parse --verifyকমান্ডটি এটি পছন্দ করে না কারণ এটি কেবল একক প্রতিশ্রুতিবদ্ধ মানগুলি গ্রহণ করে। তবে cherry-pickএকক এবং পরিসীমা প্রতিশ্রুতিযুক্ত উভয় মানেরই গ্রহণ হিসাবে , আমি জিজ্ঞাসা করি: কেন rev-parseপ্রয়োজন?
চুইম

1
@Chuim: git rev-parseআপনি একটি নির্দেশ করতে চান অন্যান্য সংগ্রহস্থলের যেমন তার সুত্র ভিত্তিক নামে কমিট প্রয়োজন হয় master, HEAD^^, বা ওই জাতীয় কিছু; রেভ-পার্স এটিকে সর্বজনীন SHA-1 সনাক্তকারী হিসাবে রূপান্তরিত করে।
জাকুব নরবস্কি

207

আপনি সম্ভবত এটি ব্যবহার করতে চান git format-patchএবং তারপরে git amসেই প্যাচটি আপনার সংগ্রহস্থলে প্রয়োগ করতে পারেন।

/path/to/1 $ git format-patch sha1^..sha1
/path/to/1 $ cd /path/to/2
/path/to/2 $ git am -3 /path/to/1/0001-…-….patch

বা, এক লাইনে:

/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3

9
এই সমাধানটি সরাসরি চেরি-বাছাইয়ের গ্রহণযোগ্য উত্তরের ব্যবহারের চেয়ে সহজ এবং সুরক্ষিত প্রমাণিত হয়েছে (এটির ফলে GIT_ALTERNATE_OBJECT_DIRECTORIESআমার সংগ্রহশালার ক্ষতি হবে)।
চুইম

2
দ্বন্দ্ব দেখা দিলে এটি কাজ করবে না কারণ এটি অন্য শাখায় কমিটগুলি সন্ধান করতে ব্যর্থ হয়।
রজার ফার

2
কমান্ডে যুক্ত --ignore-whitespaceহওয়া git amকোনও দ্বন্দ্ব সমাধান করতে পারে এবং 3-
ত্রি

97

আপনি cherry-pickপ্রথমে (এবং তারপরে fetch) রিমোট হিসাবে দ্বিতীয় রেপো যুক্ত করলে আপনি এটি করতে পারেন ।


11
এটি আসলে এটি করার সঠিক উপায়।
উইলবার্ট

5
এটি আমার কাছে সঠিক উপায়েও অনুভব করে। এবং আমি এটি ব্যবহার করেছি এবং এটি আমার পক্ষে ভাল কাজ করেছে।
রিকি নেলসন

11
আমি বরং বলব: git fetch [remote-name]দ্বিতীয় রেপো এবং তারপর করুন git cherry-pick [sha1]

5
এই পদ্ধতিটি আমার জন্য দুর্দান্ত কাজ করেছে, ধন্যবাদ। যেহেতু দ্বিতীয় রেপোটিও স্থানীয় ছিল তাই এটি রিমোট হিসাবে যুক্ত করার সময় কেবল একটি ফাইল ইউআরআই ব্যবহার করতে হয়েছিল।
পলিম্পস্টোর

2
আমার ক্ষেত্রে, আমার কাছে একটি বিশাল রিমোট গিট রিপোজিটরি (সমান্তরাল কাজকে অনুমতি দেওয়ার জন্য) এর দুটি ক্লোন রয়েছে, যার অর্থ এর ইতিহাস সমস্তই ইতিমধ্যে ডাউনলোড এবং আমার এইচডি তে দুবার সঞ্চয় করা আছে। যদি আমারও একে অপরের দূরবর্তী হিসাবে যুক্ত করতে হয় তবে এটি একই ইতিহাসের আরও দুটি অনুলিপি তৈরি করতে সক্ষম হবে এবং আমি সক্ষম হওয়ার আগে তাদের মধ্যে সম্ভবত সিঙ্কগুলি প্রয়োজন cherry-pick। সুতরাং যদিও এটি "সঠিক" উপায়ে মনে হতে পারে তবে এটি সবসময় সর্বাধিক ব্যবহারিক হয় না।
চুইম

6

রেপো ডিফের আলাদা আলাদা আউটপুট প্রয়োগের জন্য আমি একটি ছোট স্ক্রিপ্ট লিখেছিলাম https://github.com/raghakh/android-dev-scriptts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0


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