গিট সংগ্রহস্থল সামগ্রী সংরক্ষণের ইতিহাস সংরক্ষণের জন্য অন্য সংগ্রহস্থলে স্থানান্তর করা


141

আমি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে কেবলমাত্র একটি সংগ্রহস্থল ( repo1) এর সামগ্রীগুলি অন্য বিদ্যমান সংগ্রহস্থল ( repo2) এ স্থানান্তরিত করার চেষ্টা করছি :

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

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


আপনি কি রেপো 1 এর বিষয়বস্তু রেপো 2-তে একটি শাখা হিসাবে, বা মাস্টারের অংশ হিসাবে রাখতে চান, সুতরাং উভয় রেপের ফোল্ডারগুলি আপনার কার্যকরী ডিয়ারের সাথে থাকা?
ক্রনিকাল

আমি এটি মাস্টারের অংশ হিসাবে সরিয়ে নিতে চাই।
মারিও

4
এই টিউটোরিয়াল নিখুঁত! smashingmagazine.com/2014/05/19/…
xpto

উত্তর:


242

আমি মনে করি আপনি যে আদেশগুলি সন্ধান করছেন তা হ'ল:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

এরপরে এবং এর repo2/masterথেকে সমস্ত কিছু থাকবে এবং এতে উভয়ের ইতিহাস থাকবে।repo2/masterrepo1/master


ধন্যবাদ ক্রোনিয়াল, আমি কেবল এটি নিশ্চিত করতে চাই যে রেপো 1 এর একটিও শাখা রয়েছে এবং যদি আমি সেই শাখাটিও রেপো 2 এ স্থানান্তর করতে চাই?
মারিও

ভাল, repo2 এছাড়াও একটি দ্বিতীয় শাখা আছে? বা সেই শাখার কী হবে?
ক্রোনিয়াল

1
ক্রোনিয়াল, উপরের কম্যান্ডগুলি কাজ করে না! এটি ইতিহাসের অনুলিপি করেনি।
মারিও

1
ঠিক আছে, এখন এটি কাজ করে। আমি নিম্নলিখিত কমান্ডটি ব্যবহার করেছি; সিডি রেপো 2,> গিট রিমোট আরএম উত্স> গিট রিমোট অ্যাড অরিজিন url-of-repo1 ,> গিট আনতে r1remote> গিট পুশ অরিজিন মাস্টার
মারিও

1
@ বিজিথদা সবচেয়ে সহজ সমাধান হ'ল আপনি মার্জ করার আগে সমস্ত কিছু কেবল repo1একটি সাবফোল্ডারে (ভিতরে repo1) সরিয়ে নেওয়া।
ক্রোনিয়াল

55

পুরোপুরি এখানে বর্ণিত https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

প্রথমত, আমাদের বিদ্যমান সংগ্রহস্থল থেকে আমাদের স্থানীয় সূচীতে প্রত্যন্ত শাখা এবং ট্যাগগুলি আনতে হবে:

git fetch origin

আমাদের যে কোনও অনুপস্থিত শাখার স্থানীয় কপি তৈরি করতে হবে তা পরীক্ষা করতে পারি:

git branch -a

আসুন আমাদের বিদ্যমান স্থানীয় সংগ্রহস্থলে একটি নতুন রিমোট তৈরি করতে আমাদের নতুন সংগ্রহস্থলের এসএসএইচ-ক্লোনযুক্ত ইউআরএল ব্যবহার করুন:

git remote add new-origin git@github.com:manakor/manascope.git

এখন আমরা সমস্ত স্থানীয় শাখা এবং ট্যাগগুলিকে নতুন রিমোট নামের নতুন রিমোটে চাপতে প্রস্তুত:

git push --all new-origin 
git push --tags new-origin

আসুন নতুন-উত্সকে ডিফল্ট দূরবর্তী করুন:

git remote rm origin

নতুন-উত্সকে কেবলমাত্র উত্স হিসাবে নামকরণ করুন, যাতে এটি ডিফল্ট দূরবর্তী হয়ে যায়:

git remote rename new-origin origin

4
এটি নিশ্চিত করতে পারে যে এটি পুরো ইতিহাস এবং ট্যাগগুলি অনুলিপি করে। খুব সুন্দর. ধন্যবাদ।
অ্যালেক্স

নতুন-উত্সটির যদি কোনও অঙ্গীকার না থাকে তবে এটি ভালভাবে কাজ করে। তবে, নতুন-উত্সটিতে যদি কোনও প্রতিশ্রুতি থাকে, তবে এখানে যেভাবে উল্লিখিত হয়েছে তা প্রত্যাশা অনুযায়ী শব্দ করবে না।
কোট

আপনার সাথে git checkout BranchNameআবার শাখাগুলি পরিবর্তন করতে হবে তারপরে শাখাটি আবার রিমোট রেপোতে পুশ করতে হবে তবে আপনাকে git push --all new-origin অনেক ধন্যবাদ
রাাদ আলটি

21

আপনি যদি বিদ্যমান শাখাগুলি সংরক্ষণ এবং ইতিহাস প্রতিশ্রুতিবদ্ধ হতে সন্ধান করেন তবে আমার পক্ষে কাজ করার একটি উপায় এখানে।

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

এখন, ধরুন আপনি কিছু সময়ের জন্য উত্স এবং গন্তব্য রেপগুলি সিঙ্কে রাখতে চান। উদাহরণস্বরূপ, বর্তমান রিমোট রেপোর মধ্যে এখনও ক্রিয়াকলাপ রয়েছে যা আপনি নতুন / প্রতিস্থাপন রেপোতে আনতে চান।

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

সর্বশেষ আপডেটগুলি টেনে আনার জন্য (ধরে নেওয়া যাক আপনার কোনও স্থানীয় পরিবর্তন নেই):

git checkout {branch(es) of interest}
git pull old
git push --all new

এনবি: আমার কাছে এখনও সাবমডিউল ব্যবহার করা হয়নি, তাই আপনার কাছে যদি আরও কোন পদক্ষেপের প্রয়োজন হয় তবে আমি জানি না I


1
এটি আমার জন্য সহজ এবং সহজে কাজ করেছিল। আমি মনে করি এটি চেক করা উত্তর হওয়া উচিত। আপনার যদি 60 টি শাখা থাকে তবে এটি যাওয়ার উপায়।
রিকফুসুসা

7

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

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

এটি আমার স্থানীয় রেপোকে (ইতিহাস সহ) আমার দূরবর্তী github.com রেপোতে স্থানান্তরিত করতে কাজ করেছিল। GitHub.com এ নতুন খালি রেপো তৈরি করার পরে আমি নীচের তিন ধাপে ইউআরএলটি ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে।

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

আমি এটি এখানে পেয়েছি: https://gist.github.com/niksumeiko/8972566


1
আসল সংগ্রহস্থলটি দেওয়ার সহজতম উপায় এটি। এটি সমস্ত শাখাগুলিও অনুলিপি করে।
গিলারমো

1
এটি সমস্ত ট্যাগের অনুলিপি করে।
কাক

2

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

স্থানীয়তে পুরানো সংগ্রহস্থলটি ক্লোন করুন।

git clone --bare <STASH-URL>

গিটল্যাবে একটি খালি সংগ্রহস্থল তৈরি করুন।

git push --mirror <GitLab-URL>

1

দেখে মনে হচ্ছে আপনি কাছে এসেছেন। ধরে cd repo2নিচ্ছি যে এটি আপনার জমা দেওয়ার ক্ষেত্রে কেবল একটি টাইপো নয়, পদক্ষেপ 3 repo1 এর পরিবর্তে হওয়া উচিত । এবং ধাপ 6 git pullধাক্কা করা উচিত নয়। পুনরায় কাজ করা তালিকা:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

ধন্যবাদ এরিক, তবে 3 ধাপে আমি কোনও রিমোট পরিবর্তন এড়াতে মূল সংগ্রহস্থলের লিঙ্কটি সরাতে চাই .. যেহেতু আমি সামগ্রীগুলি রেপো 1 থেকে রেপো 2 এ স্থানান্তর করতে চাই।
মারিও

ঠিক আছে. আমি প্রতিফলিত করার চেষ্টা করার জন্য আমার উত্তর সম্পাদনা করেছি। কেবলমাত্র নিশ্চিত করার জন্য, আপনি একটি সংগ্রহস্থল তৈরি করার চেষ্টা করছেন, রেপো 2, এটি রেপো 1 এর অনুলিপি কিন্তু রেপো 1 বা উত্সকে রিমোট হিসাবে রাখে না?
এরিক প্যালেস

না, আমি একটি নতুন রেপো "রেপো 2" তৈরি করার চেষ্টা করছি না। প্রকৃতপক্ষে, আমার একটি বিদ্যমান রেপো 2 রয়েছে যাতে অন্যান্য সামগ্রী রয়েছে। এখন আমি ইতিহাসের সাথে রেপো 1 তে সমস্ত লিখিত সামগ্রী সরানোতে চাই। সার্ভারে যেমন রয়েছে তেমন আমি রেপো 1 খালি রাখব।
মারিও

আপনি গিট ব্যবহার না বিবেচনা করেছেন? দেখে মনে হচ্ছে আপনি সম্ভবত ফাইলগুলি অনুলিপি করতে পারেন (একটি গুই বা স্কিপ বা এফটিপি মাধ্যমে) এবং ম্যানুয়ালি এগুলি আপনার গিট রেপোতে যুক্ত করতে পারেন। এটি তেমন দক্ষ নাও হতে পারে তবে এটি সম্ভবত সহজ।
এরিক প্যালেস

আমি ইতিমধ্যে এটি চেষ্টা করেছি কিন্তু এটি ইতিহাস ছেড়ে গেছে। আমি এর ইতিহাসের সমস্তটিও সরিয়ে নিতে চাই।
মারিও

1

@ ড্যান-কোহনের উত্তর অনুসারে মিরর-পুশ এখানে আপনার বন্ধু। এটি স্থানান্তরের রেপোগুলির জন্য আমার যেতে হবে:

একটি ভান্ডার মিরর করছি

1- ওপেন গিট ব্যাশ

2. ভান্ডারগুলির একটি খালি ক্লোন তৈরি করুন।

$ git clone --bare https://github.com/exampleuser/old-repository.git

3. নতুন ভাণ্ডারে মিরর-পুশ করুন।

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4- অধ্যায় 1 আপনি তৈরি অস্থায়ী স্থানীয় সংগ্রহস্থল সরান।

$ cd ..
$ rm -rf old-repository.git

রেফারেন্স এবং ক্রেডিট: https://help.github.com/en/articles/duplicating-a-repository


-1

এখানে অনেক জটিল উত্তর রয়েছে; তবে, আপনি যদি শাখা সংরক্ষণের বিষয়ে উদ্বিগ্ন না হন তবে আপনাকে যা করতে হবে তা হ'ল দূরবর্তী উত্সটি পুনরায় সেট করা, উজান সেট করা এবং ধাক্কা।

এটি আমার জন্য সমস্ত প্রতিশ্রুতিবদ্ধ ইতিহাস সংরক্ষণ করার জন্য কাজ করেছিল।

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.