অন্য গিট সংগ্রহস্থল থেকে কি কমিটিকে চেরি-পিক করা সম্ভব?


724

আমি একটি গিট সংগ্রহস্থল নিয়ে কাজ করছি যার জন্য অন্য গিট সংগ্রহস্থলের একটি প্রতিশ্রুতি দরকার যা প্রথমটির কিছুই জানে না।

সাধারণত আমি HEAD@{x}রিফ্লগটিতে চেরি-বাছাই করতাম, তবে কারণ .gitএই রিফ্লগ এন্ট্রি (বিভিন্ন শারীরিক ডিরেক্টরি) কিছুই জানে না, আমি কীভাবে এই চেরি-বাছাই করতে পারি, বা করতে পারি?

আমি ব্যবহার করছি git-svn। আমার প্রথম শাখা ব্যবহার করা হয় git-svnএর trunkএকটি Subversion রেপো, এবং পরবর্তী শাখা ব্যবহার করা হয় git-svnএকটি Subversion ডালে।


2
এই প্রশ্নে বেন্টি লি খোলা থাকার জন্য বেন লি এই কারণটি দিয়েছেন : "আমি অনুগ্রহ করে সঠিক উত্তরের পরিবর্তে গৃহীত উত্তরটি প্রদান করব। এটি করার জন্য আমাকে কেবল ২৪ ঘন্টা অপেক্ষা করতে হবে" " যাইহোক, আমি বুঝতে পারি না যে এর মধ্যে কোনটি "সঠিক উত্তর" বলে মনে করা হচ্ছে এবং কেন গৃহীত উত্তরটি "সঠিক" নয়।

1
সমস্যার প্রকৃতি কী তা এটি পরিষ্কার নয়। এই বিভিন্ন রেপোগুলি কীভাবে সম্পর্কিত? এক কি অন্যের কাঁটাচামচ? নাকি এগুলি আসলে দুটি সম্পূর্ণ পৃথক ও সম্পর্কহীন প্রকল্প?

@ ক্যাপকেকে, গ্রহণযোগ্য উত্তরটি ভাল, এবং স্পষ্টভাবে ওপিকে সহায়তা করেছে, সুতরাং এটি গ্রহণ করা উচিত। "ডান" দ্বারা আমি সত্যিই "আমার পক্ষে সঠিক" বলতে চাইছিলাম (এবং মন্তব্যে বিচার করে, বেশ কয়েকটি অন্যান্য ব্যক্তির পক্ষেও এটি সঠিক)। আমি কেবল ভেবেছিলাম যে আমি এই অনুগ্রহটি দিয়েছি তা গৃহীত উত্তরের মতো যথাযথ প্রাপ্য হিসাবে প্রাপ্য।
বেন লি

উত্তর:


554

আপনাকে অন্য সংগ্রহস্থলটিকে একটি রিমোট হিসাবে যুক্ত করতে হবে, তারপরে এর পরিবর্তনগুলি আনতে হবে। সেখান থেকে আপনি প্রতিশ্রুতি দেখুন এবং আপনি এটি চেরি-বাছাই করতে পারেন।

সে রকমই:

git remote add other https://example.link/repository.git
git fetch other

এখন আপনার কাছে সহজভাবে করার মতো সমস্ত তথ্য রয়েছে git cherry-pick

রিমোটগুলির সাথে কাজ করার বিষয়ে আরও তথ্য এখানে: https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes


1
আমি যদি গিট-এসএনএন ব্যবহার করছি? আমার প্রথম শাখা ট্রাঙ্কের গিট-এসএনএন ব্যবহার করছে এবং পরেরটি একটি শাখায় গিট-এসএনএন ব্যবহার করছে (দ্রুত উত্তরের জন্য ধন্যবাদ)
gitcoder182

1
আপনি যখন সাবভারশন রিপোজিটরিটি প্রথম ক্লোন করেছেন তা নিশ্চিত করুন যে আপনি কেবল ট্রাঙ্কটিই নয়, পুরো সংগ্রহস্থলটিকে ক্লোন করেছেন । এছাড়াও --stdlayoutসাবট্রিশনে আপনি যদি স্ট্যান্ডার্ড ট্রাঙ্ক / শাখা / ট্যাগ লেআউট ব্যবহার করছেন তবে গিট-এসএনএন- এর বিকল্পটি ব্যবহার করেছেন তা নিশ্চিত করুন । তারপরে সাবভার্সন শাখাটি কেবল একটি দূরবর্তী গিট শাখা হবে।
উইলহেমটেল

33
আপনি যদি গিথুব ব্যবহার করছেন তবে আপনি প্রতিশ্রুতিবদ্ধ ইউআরএল। প্যাচ যুক্ত করে প্যাচটি টানতে পারেন, এবং তারপরে এটি প্রয়োগ করে git am < d821j8djd2dj812.patch। জিএইচ বাইরে, নীচের বিকল্প উত্তরে রেফারেন্স হিসাবে অনুরূপ ধারণাগুলি করা যেতে পারে।
র‌্যাডিক্যান্ড

2
@ আরডিক্যান্ড নীচে কোন উত্তরটি "বিকল্প"? এটি লিঙ্ক করুন।

7
অন্য রেপো থেকে চেরি নিতে বিশদ পদক্ষেপ: কোডারওয়াল
.

854

উত্তর হিসাবে দেওয়া হয়েছে, ফর্ম্যাট-প্যাচ ব্যবহার করা হয় তবে যেহেতু প্রশ্নটি ছিল যে অন্য ফোল্ডার থেকে চেরি-পিক কীভাবে করা যায়, তাই এখানে কোডের এক টুকরোটি ঠিক তা করতে হবে:

$ git --git-dir=../<some_other_repo>/.git \
format-patch -k -1 --stdout <commit SHA> | \
git am -3 -k

( @ কং মা থেকে ব্যাখ্যা )

git format-patchকমান্ড থেকে একটি প্যাচ তৈরি করে some_other_repoএর তার Sha দ্বারা নিদিষ্ট কমিট ( -1একটি একক একা কমিট)। এই প্যাচটি পাইপ করা হয়েছে git am, যা স্থানীয়ভাবে প্যাচটি প্রয়োগ করে (এর -3অর্থ প্যাচটি পরিষ্কারভাবে প্রয়োগ করতে ব্যর্থ হলে ত্রি-মুখী সংযোজনের চেষ্টা করা)। আশা করি যে ব্যাখ্যা।


18
এটি স্পট রয়েছে, তবে এটি দুর্দান্ত হবে যদি কেউ এ সম্পর্কে প্রসারিত করতে পারে - ঠিক কী চলছে (বিশেষত এই পতাকাগুলির সাথে) একটি বিচ্ছেদের অবিশ্বাস্যভাবে কার্যকর হবে।
নিক এফ

45
@ নিকএফ, git format-patchকমান্ডটি some_other_repoতার এসএইচএ দ্বারা নির্দিষ্ট করা কমিট থেকে একটি প্যাচ তৈরি করে ( -1একক একক প্রতিশ্রুতির জন্য)। এই প্যাচটি পাইপ করা হয়েছে git am, যা স্থানীয়ভাবে প্যাচটি প্রয়োগ করে (এর -3অর্থ প্যাচটি পরিষ্কারভাবে প্রয়োগ করতে ব্যর্থ হলে ত্রি-মুখী সংযোজনের চেষ্টা করা)। আশা করি যে ব্যাখ্যা।
কংগা মা

3
ত্রুটি: প্যাচ ব্যর্থ হয়েছে: somefile.cs: 85 ত্রুটি: somefile.cs: প্যাচ প্রয়োগ হয় না আপনি কি নিজের প্যাচ সম্পাদনা করেছেন? এটি এর সূচীতে রেকর্ড করা ব্লবগুলিতে প্রয়োগ হয় না। ত্রি-মুখী সংশ্লেষে ফিরে যেতে পারে না। প্যাচটি 0001 এ সংযুক্ত জিইউআই অংশগুলিতে ব্যর্থ হয়েছিল। যে প্যাচটি ব্যর্থ হয়েছে তার অনুলিপিটি পাওয়া যায়: <some_other_repo> /.git/rebase-apply/patch আপনি যখন এই সমস্যার সমাধান করেছেন, তখন "গিট অ্যাম - কনটিনিউ" চালান। আপনি যদি এই প্যাচটি এড়িয়ে যেতে পছন্দ করেন তবে তার পরিবর্তে "গিট অ্যাম --স্কিপ" চালান। আসল শাখাটি পুনরুদ্ধার করতে এবং প্যাচিং বন্ধ করতে, "গিট অ্যাম --abort" চালান।
টম

8
@ টম ব্যবহার করার চেষ্টা করুন --ignore-whitespace। পূর্ণ কমান্ড: git --git-dir=../<some_other_repo>/.git format-patch -k -1 --stdout <commit SHA> | git am -3 -k --ignore-whitespace
জেক গ্রাহাম আর্নল্ড

7
@ বুমশ্যাডো কারণ এটি উপায় সহজ। রিমোট যুক্ত করা এবং আনতে অন্যান্য রেপোর সমস্ত পরিবর্তন এনে দেয়। এই কমান্ড লাইনটি এককালীন ক্রিয়া।
জোনাথন রাইনহার্ট

151

এখানে রিমোট-ফেচ-মার্জের উদাহরণ's

cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

তারপর তুমি পারো:

git cherry-pick <first_commit>..<last_commit>

অথবা আপনি এমনকি পুরো শাখাটি মার্জ করতে পারেন

git merge projectB/master

54
git merge projectB/master খুব, খুব ভুল , কারণ আপনি আবেদন করছেন না কমিট একটি একক থেকে পরিবর্তনগুলি (একটি চেরি-বাছুন মত would), আপনি আসলে মধ্যে মার্জ করছি সকল পরিবর্তন মধ্যেprojectB/masterআপনার নিজের অন্তর্ভুক্ত করা হয় নাmasterশাখা।

4
এটি আমার ধারণা ছিল যে এটিই মূল পোস্টারের অভিপ্রায়। অন্যথায়, হ্যাঁ, এটি তাদের পক্ষে সঠিক বিকল্প নয়।
ব্রায়ান

5
দুটি সংগ্রহস্থল সম্পর্কিত হলে এটি উজ্জ্বলতার সাথে কাজ করে।
রনি অ্যাগার-উইক

1
আমি গিট সংগ্রহস্থল থেকে একটি অনুলিপি তৈরি করেছি (মূল রেপোটি না ভেঙে কেবল "চারপাশে খেলার জন্য") এবং এটির উত্সটি দিয়ে আপ টু ডেট রাখার জন্য ব্রায়ানের কাছ থেকে উত্তরটি ঠিক আমার যা প্রয়োজন, তাই কাপকেক, আমি বলতে হবে, এটি "ভুল" নয়, তবে অন্য ব্যবহারের ক্ষেত্রে। তবে সম্ভাব্য বিপর্যয়টি দেখানো আপনার পক্ষে দুর্দান্ত: ডি
ফেরারি ২ কে

6
আইএমও এটির গ্রহণযোগ্য সমাধান হওয়া দরকার। এছাড়াও, আপনি চেরি-বাছাইয়ের পরে যদি রিমোটটি মুছতে চান তবে এটি ব্যবহার করুন git remote rm projectBgit tag -d tag-nameদূরবর্তী রেপো থেকে যে কোনও ট্যাগ আনার জন্যও ব্যবহার করুন । রিমোট কমিটগুলি আপনার ইতিহাসে আর প্রদর্শিত হবে না এবং ছাঁটাই শেষ পর্যন্ত সেগুলি সঞ্চয়স্থান থেকে সরিয়ে ফেলবে।
এডিটিসি

130

আপনি এটি করতে পারেন, তবে এটির জন্য দুটি পদক্ষেপ প্রয়োজন। এখানে কীভাবে:

git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD

<remote-git-url>ইউআরএল বা পুনরায় সংগ্রহস্থলের পাথ দিয়ে প্রতিস্থাপন করুন যা থেকে আপনি চেরি-বাছাই করতে চান।

<branch>দূরবর্তী সংগ্রহস্থল থেকে চেরি-বাছাই করতে চান সেই শাখা বা ট্যাগের নামটি দিয়ে প্রতিস্থাপন করুন ।

আপনি FETCH_HEADশাখা থেকে একটি গিট SHA দিয়ে প্রতিস্থাপন করতে পারেন ।

আপডেট হয়েছে: @ পকালিনোর প্রতিক্রিয়ার ভিত্তিতে সংশোধিত


8
এটি একটি শাখার নাম নিয়ে কাজ করে তবে SHA দিয়ে নয়। যদি আপনি চাই প্রতি চেরি-বাছাই একটি কমিট তার হ্যাশ দ্বারা প্রকাশ, পরিবর্তে এটি ব্যবহার: git fetch <repo-url> <branch> && git cherry-pick <sha>
pkalinow

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

বিভিন্ন ক্লায়েন্টদের (যাদের প্রত্যেকের নিজস্ব নিজস্ব ভাণ্ডার / কাঁটাচামচ রয়েছে) জন্য আমাদের কোডের অনেকগুলি কাস্টম বাস্তবায়নের সাথে আমার ঠিক এটিই ছিল যা আমাদের বেস / ট্রাঙ্কে নির্দিষ্ট কমিটগুলি পাওয়ার জন্য আমাদের প্রয়োজন ছিল। ধন্যবাদ!
রেডস্যান্ডস

রেপো জুড়ে একটি শট চেরি বাছাইয়ের জন্য এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ইতিমধ্যে স্থানীয় যে রেপোসের মধ্যে বাছাই করার সময় আমি এটি সর্বদা ব্যবহার করি, দূরবর্তী URL তখন কেবল একটি স্থানীয় ফাইল সিস্টেমের পথ।
আমেদী ভ্যান গ্যাসে

61

এখানে একটি দূরবর্তী, শাখাগুলি আনার এবং চেরি-বাছাই একটি প্রতিশ্রুতি যুক্ত করার পদক্ষেপগুলি এখানে রয়েছে

# Cloning our fork
$ git clone git@github.com:ifad/rest-client.git

# Adding (as "endel") the repo from we want to cherry-pick
$ git remote add endel git://github.com/endel/rest-client.git

# Fetch their branches
$ git fetch endel

# List their commits
$ git log endel/master

# Cherry-pick the commit we need
$ git cherry-pick 97fedac

সূত্র: https://coderwall.com/p/sgpksw


17

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


11

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

git fetch ssh://git@stash.mycompany.com:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533
# 

গিট আনতে [শাখার ইউআরএল] [থেকে চেরি-পিক করতে শাখা] এবং & গিট চেরি-পিক [কমিট আইডি]


1
চিয়ার্স, ssh://কেবল অংশটির দরকার নেইhttps://
লিও

5

হ্যাঁ. সংগ্রহস্থলটি আনুন এবং তারপরে দূরবর্তী শাখা থেকে চেরি-পিক করুন।


1

ধরে নেওয়া যাক Aরেপো আপনি চান থেকে চেরি-বাছাই, এবং Bআপনি করতে চান চেরি-বাছাই, আপনি যোগ করে এটা করতে পারেন </path/to/repo/A/>/.git/objectsকরতে </path/to/repo/B>/.git/objects/info/alternatesalternatesএটি উপস্থিত না থাকলে এই ফাইলগুলি তৈরি করুন ।

এটি রেপো বি থেকে রেপো এ থেকে সমস্ত গিট বস্তু অ্যাক্সেস করবে এবং আপনার জন্য চেরি-পিকের কাজ করবে।


0

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

git reset --hard
git remote update --prune
git pull --rebase --all
git cherry-pick -n remotes/origin/$(BRANCH)

খালি রেপোকে মাস্টার আপ টু ডেট রেখে আমরা খালি রেপোতে প্রকাশিত প্রস্তাবিত পরিবর্তনকে চেরি-বেছে নিতে সক্ষম হয়েছি। আমাদের একীভূত পর্যালোচনা এবং পরীক্ষার জন্য চেরি-পিক একাধিক ব্রাশ করার উপায় (আরও জটিল)।

যদি "কিছুই জানে না" এর অর্থ যদি "রিমোট হিসাবে ব্যবহার করা যায় না", তবে এটি সাহায্য করে না, তবে এই কাজটি প্রবাহটি নিয়ে আসার জন্য যখন আমি ঘুরে বেড়াচ্ছিলাম তখন এই প্রশ্নটি উঠে এসেছিল তাই আমি ভেবেছিলাম আমি ফিরে অবদান রাখব।


-ন মানে গিট ডক্স অনুসারে
অ-

0

আপনি যদি কোনও প্রদত্ত প্রতিশ্রুতি না পৌঁছানো পর্যন্ত কোনও প্রদত্ত ফাইলের জন্য একাধিক কমিট চেরি-পিক করতে চান তবে নীচেরটি ব্যবহার করুন।

# Directory from which to cherry-pick
GIT_DIR=...
# Pick changes only for this file
FILE_PATH=...
# Apply changes from this commit
FIST_COMMIT=master
# Apply changes until you reach this commit
LAST_COMMIT=...

for sha in $(git --git-dir=$GIT_DIR log --reverse --topo-order --format=%H $LAST_COMMIT_SHA..master -- $FILE_PATH ) ; do 
  git --git-dir=$GIT_DIR  format-patch -k -1 --stdout $sha -- $FILE_PATH | 
    git am -3 -k
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.