কীভাবে বিদ্যমান গিট সংগ্রহস্থলটিকে অন্যটিতে আমদানি করবেন?


476

আমি একটি ফোল্ডার নামক একটি গীত সংগ্রহস্থলের আছে XXX এর , এবং আমি দ্বিতীয় গীত সংগ্রহস্থলের নামের YYY

আমি আমদানি করতে চান XXX এর মধ্যে সংগ্রহস্থল YYY একটি সাব-নামে যেমন সংগ্রহস্থলের ZZZ এবং সব যোগ XXX এর থেকে এর পরিবর্তনের ইতিহাস YYY

পূর্বে ফোল্ডার কাঠামো:

├── XXX
│   ├── .git
│   └── (project files)
└── YYY
    ├── .git
    └── (project files)

এর পরে ফোল্ডার কাঠামো:

YYY
├── .git  <-- This now contains the change history from XXX
├──  ZZZ  <-- This was originally XXX
│    └── (project files)
└──  (project files)

এটি করা যেতে পারে, বা আমার কি সাব-মডিউলগুলি ব্যবহার করে অবলম্বন করা উচিত?


2
আপনি যখন নতুন রেপো তৈরি করবেন তখন
গিথুবে

উত্তর:


429

সম্ভবত সবচেয়ে সহজ উপায় হ'ল YYY এর একটি শাখায় XXX স্টাফগুলি টানুন এবং তারপরে এটি মাস্টারে মার্জ করুন:

ইন YYY :

git remote add other /path/to/XXX
git fetch other
git checkout -b ZZZ other/master
mkdir ZZZ
git mv stuff ZZZ/stuff                      # repeat as necessary for each file/dir
git commit -m "Moved stuff to ZZZ"
git checkout master                
git merge ZZZ --allow-unrelated-histories   # should add ZZZ/ to master
git commit
git remote rm other
git branch -d ZZZ                           # to get rid of the extra branch before pushing
git push                                    # if you have a remote, that is

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

দ্রষ্টব্য: যেহেতু এটি মূলত ২০০৯ সালে লেখা হয়েছিল, গিট নীচের উত্তরে উল্লিখিত সাবট্রি মার্জ যুক্ত করেছে। আমি সম্ভবত আজ সেই পদ্ধতিটি ব্যবহার করব যদিও অবশ্যই এই পদ্ধতিটি এখনও কাজ করে না।


1
ধন্যবাদ। আমি আপনার কৌশলটির কিছুটা পরিবর্তিত সংস্করণ ব্যবহার করেছি: আমি XXX এ একটি 'স্টেজিং' শাখা তৈরি করেছি যেখানে আমি জেডজেডজেড ফোল্ডার তৈরি করেছি এবং এতে 'স্টাফ' সরিয়েছি। তারপরে আমি XXX কে YYY এ মিশ্রিত করলাম।
বিজয় প্যাটেল

1
এটি আমার জন্য কাজ করে মহান। আমি কেবল পরিবর্তনগুলি করেছি: 1) ধাক্কা দেওয়ার আগে "গিট ব্রাঞ্চ-ডি জেডজেডজেড" কারণ আমি এই টেম্প শাখাটি ঝুলতে চাইনি। 2) "গিট পুশ" আমাকে ত্রুটি দিচ্ছিল: "কোনও রেফস সাধারণ নয় এবং কেউই নির্দিষ্ট করে নি; কিছুই করছে না Perhaps সম্ভবত আপনাকে 'মাস্টার' এর মতো কোনও শাখা নির্দিষ্ট করা উচিত" " (আমি যে উত্সটির দিকে ধাক্কা দিচ্ছিলাম এটি একটি খালি খালি ভাণ্ডার)) তবে "গিট পুশ - সমস্ত" চ্যাম্পের মতো কাজ করেছিল।
ক্রেজিপাইরো

1
আমি ওয়াইওয়াই রেপোতে কেবল জেডজেডজেড ফোল্ডার সহ ইতিহাস শেষ করতে চেয়েছিলাম: আমি মূল ইউএসএক্স রেপো এবং ওয়াইওয়াই রেপোতে জেডজেডজেড শাখা মুছতে চাইছিলাম। @ ক্র্যাজিপাইরো ইতিহাস মুছে ফেলার পরামর্শ দিয়ে আমি জেডজেডজেড শাখাটি মুছে ফেলার বিষয়টি দেখতে পেয়েছি - এটি মুছে ফেলার আগে আমি জেডজেডজেড শাখাকে মাস্টারে মিশেছি।
অলি স্টোহলমে

4
@ সেবাস্তিয়ানব্ল্যাস্ক আমি আমার দু'টি রেপোকে নিয়ে এই নিয়ে মাত্র গোলমাল করেছি, এবং বুঝতে পেরেছি যে এখানে একটি অনুপস্থিত পদক্ষেপ রয়েছে যা আমি কেউ বছরের পর বছর ধরে এই বিষয়গুলি জানার পরেও লক্ষ্য করি নি। :-) আমি এটিকে মাস্টার হিসাবে মার্জ করার কথা উল্লেখ করেছি , তবে বাস্তবে এটি প্রদর্শন করে নি। এখন এটি সম্পাদনা করা ...
ebneter

2
আপনার সাবফোল্ডারে ফাইলগুলি সরানোর সময় আপনি এই জাতীয় কিছু যুক্ত করতে পারেন: git mv $(ls|grep -v <your foldername>) <your foldername>/ এটি আপনার নতুন ফোল্ডারে সমস্ত ফাইল এবং ফোল্ডারগুলি অনুলিপি করবে
সার্প

366

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

git remote add XXX_remote <path-or-url-to-XXX-repo>
git fetch XXX_remote
git merge -s ours --no-commit --allow-unrelated-histories XXX_remote/master
git read-tree --prefix=ZZZ/ -u XXX_remote/master
git commit -m "Imported XXX as a subtree."

আপনি যেমন প্রবাহিত পরিবর্তনগুলি ট্র্যাক করতে পারেন:

git pull -s subtree XXX_remote master

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

Downside হয় যে মার্জ ইতিহাসে ফাইল প্রিফিক্স না করা হয় (ক সাব নেই) হয়। ফলস্বরূপ git log ZZZ/aআপনি সংযুক্ত ইতিহাসে থাকা সমস্ত পরিবর্তনগুলি (যদি থাকে তবে) দেখাবে। আপনি করতে পারেন:

git log --follow -- a

তবে এটি মার্জ হওয়া ইতিহাসে অন্য পরিবর্তনগুলি দেখাবে না।

অন্য কথায়, আপনি যদি ZZZসংগ্রহস্থলের ফাইলগুলি পরিবর্তন না করেন XXX, তবে আপনাকে নির্দিষ্ট করা --followএবং একটি পূর্বনির্ধারিত পথ প্রয়োজন। আপনি যদি উভয় সংগ্রহস্থলে এগুলি পরিবর্তন করেন তবে আপনার কাছে 2 টি কমান্ড রয়েছে যার কোনওটিই সমস্ত পরিবর্তন দেখায় না।

2.9 এর আগে গিট সংস্করণ : আপনার কাছে --allow-unrelated-historiesবিকল্পটি পাস করার দরকার নেই git merge

অন্য উত্তরের যে পদ্ধতিটি পদক্ষেপটি ব্যবহার করে read-treeএবং এড়িয়ে যায় merge -s oursতা কার্যকরভাবে সিপি দিয়ে ফাইলগুলি অনুলিপি করা এবং ফলাফল প্রতিপন্ন করার চেয়ে আলাদা নয়।

আসল উত্স ছিল গিথুবের "সাবট্রি মার্জ" সহায়তা নিবন্ধ থেকে । এবং অন্য দরকারী লিঙ্ক


9
এটি ইতিহাস সংরক্ষণ করে আছে বলে মনে হচ্ছে না ... git logআমি টানা ফাইলগুলিতে যদি আমি একটি করে করি তবে আমি কেবল একক মার্জ কমিট এবং অন্যান্য রেপোতে এর আগের জীবন থেকে কিছুই দেখতে পাচ্ছি না? গিট
1.8.0

8
আহা! যদি আমি আমদানিকৃত ফাইলের পুরাতন পথ ব্যবহার, অর্থাত্ ফেরত subdir এটা আমদানি করা হয়েছে, তারপর Git লগ আমাকে দিতে হবে ইতিহাস কমিট, যেমন git log -- myfileপরিবর্তেgit log -- rack/myfile
Anentropic

2
নিবন্ধন করুন ইতিহাস এনে দেওয়া এই পদ্ধতির একটি বৈশিষ্ট্য
প্যাট্রিকভেসেক

4
@ ফ্রেঞ্চসো ফ্রেসাইনেলি, আপনি যদি ইতিহাস না চান তবে কেন কেবল নিয়মিত অনুলিপি করবেন না? আমি ইতিহাসের জন্য না হলে এই পদ্ধতিতে আপনাকে কী আকর্ষণ করবে তা নির্ধারণ করার চেষ্টা করছি - আমি এই পদ্ধতিটিই ব্যবহার করেছি!
প্যাট্রিকভ্যাসেক

7
গিট ২.৯ থেকে, --allow-unrelated-historiesমার্জ করার সময় আপনার বিকল্পের প্রয়োজন need
stuXnet

112

git-subtreeইতিহাস সংরক্ষণ করার সময় একাধিক সংগ্রহস্থল একত্রে মার্জ করার ক্ষেত্রে (এবং / অথবা সাবট্রির ইতিহাস বিভাজনের ইতিহাস, যদিও এটি এই প্রশ্নের অপ্রাসঙ্গিক বলে মনে হয়) ঠিক এই ব্যবহারের ক্ষেত্রে তৈরির জন্য একটি স্ক্রিপ্ট। এটি 1.7.11 প্রকাশের পর থেকে গিট গাছের অংশ হিসাবে বিতরণ করা হয়েছে

<repo>সংশোধনীতে <rev>উপ-ডিরেক্টরি হিসাবে একটি সংগ্রহস্থলকে মার্জ করতে <prefix>, নীচে git subtree addহিসাবে ব্যবহার করুন :

git subtree add -P <prefix> <repo> <rev>

গিট-সাবট্রি আরও বেশি ব্যবহারকারী বান্ধব উপায়ে সাবট্রি মার্জ কৌশল প্রয়োগ করে ।

YYY ভান্ডারের ভিতরে আপনার ক্ষেত্রে, আপনি দৌড়াবেন:

git subtree add -P ZZZ /path/to/XXX.git master

Downside হয় যে মার্জ ইতিহাসে ফাইল প্রিফিক্স না করা হয় (ক সাব নেই) হয়। ফলস্বরূপ git log ZZZ/aআপনি সংযুক্ত ইতিহাসে থাকা সমস্ত পরিবর্তনগুলি (যদি থাকে তবে) দেখাবে। আপনি করতে পারেন:

git log --follow -- a

তবে এটি মার্জ হওয়া ইতিহাসে অন্য পরিবর্তনগুলি দেখাবে না।

অন্য কথায়, আপনি যদি ZZZসংগ্রহস্থলের ফাইলগুলি পরিবর্তন না করেন XXX, তবে আপনাকে নির্দিষ্ট করা --followএবং একটি পূর্বনির্ধারিত পথ প্রয়োজন। আপনি যদি উভয় সংগ্রহস্থলে এগুলি পরিবর্তন করেন তবে আপনার কাছে 2 টি কমান্ড রয়েছে যার কোনওটিই সমস্ত পরিবর্তন দেখায় না।

এটি এখানে আরও


4
যদি আপনার কাছে একটি খালি সংগ্রহস্থল বা রিমোটের পরিবর্তে মার্জ করার জন্য কোনও ডিরেক্টরি থাকে,git subtree add -P name-of-desired-prefix ~/location/of/git/repo-without-.git branch-name
তাতাস

2
নুব অভিজ্ঞতা: গিট (সংস্করণ ২.৯.০. উইন্ডোস .১) "মারাত্মক: দ্বিধাহীন যুক্তি 'হেড': অজানা সংশোধন বা কার্যনির্বাহী বৃক্ষে নয় পাথ" প্রতিক্রিয়া জানায় যখন আমি এটি সদ্য প্রারম্ভিক, স্থানীয়, নন-খালি ভাণ্ডারে চেষ্টা করেছি, আমি সত্যিই নতুন সংগ্রহস্থলটি পেলাম, অর্থাত্ একটি সরল ফাইল যুক্ত করার পরে এবং নিয়মিতভাবে প্রতিশ্রুতিবদ্ধ হওয়ার পরে এটি কার্যকর হয়েছিল।
স্টেইন

আমার দৃশ্যের জন্য সুন্দরভাবে কাজ করেছেন।
জনি উটাহ

ওহ এটি দুর্দান্ত।
dwjohnston

আমি @ টাটসের পরামর্শটি ব্যবহার করেছি এবং এটি আমার পক্ষে কাজ করেছে
কারমিন তাম্বাসকিয়া

49

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

  • এটি গিট সংগ্রহস্থলে উপস্থিত হয় যেন এটি গিটের অংশ হিসাবে সর্বদা বিকাশিত ছিল,
  • সমস্ত ইতিহাস অক্ষত রাখা হয় এবং
  • এটি এখনও পুরানো সংগ্রহস্থলে স্বাধীনভাবে বিকাশ করা যেতে পারে, পরিবর্তনগুলি সহজভাবে git pullসম্পাদনা করা সহ।

ই-মেইলে পুনরুত্পাদন করার জন্য প্রয়োজনীয় পদক্ষেপ রয়েছে তবে এটি হৃদয়ের মূর্ছনার জন্য নয়: প্রথমে লিনাস গিট লিখেছিলেন , তাই তিনি সম্ভবত আপনার বা আমার চেয়ে কিছুটা বেশি জানেন এবং দ্বিতীয়ত, এটি প্রায় ৫ বছর আগে ছিল এবং গিট এর পর থেকে যথেষ্ট উন্নতি করেছে , তাই সম্ভবত এটি এখন অনেক সহজ।

বিশেষত, আমি অনুমান করি আজকাল কেউ এই নির্দিষ্ট ক্ষেত্রে গিটক সাবমডিউল ব্যবহার করবে।


3
BTW। পরবর্তী মার্জগুলির জন্য ব্যবহৃত কৌশলটিকে (যদি কোনও থাকে) বলা হয় সাবট্রি মার্জ, এবং সেখানে তৃতীয় পক্ষের git-subtreeসরঞ্জাম রয়েছে যা আপনাকে এটিতে
Jakub Narębski

ধন্যবাদ, আমি সে সম্পর্কে ভুলে গেছি subtreeএকত্রীকরণ কৌশল, বিশেষত সাথে git-subtreeটুল একটা চমৎকার, হয়তো submodules এমনকি উচ্চতর বিকল্প।
জার্গ ডব্লু মিটাগ

12

এটি করার সহজ উপায় হ'ল গিট ফর্ম্যাট-প্যাচ ব্যবহার করা।

ধরুন আমাদের কাছে 2 গিট সংগ্রহস্থল রয়েছে ফু এবং বার

foo রয়েছে:

  • foo.txt
  • .git

বার থাকে:

  • bar.txt
  • .git

এবং আমরা বারের ইতিহাস এবং এই ফাইলগুলি ধারণ করে ফু দিয়ে শেষ করতে চাই :

  • foo.txt
  • .git
  • FOOBAR / bar.txt

সুতরাং এটি করতে:

 1. create a temporary directory eg PATH_YOU_WANT/patch-bar
 2. go in bar directory
 3. git format-patch --root HEAD --no-stat -o PATH_YOU_WANT/patch-bar --src-prefix=a/foobar/ --dst-prefix=b/foobar/
 4. go in foo directory
 5. git am PATH_YOU_WANT/patch-bar/*

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

git filter-branch --msg-filter 'sed "1s/^/\[bar\] /"' COMMIT_SHA1_OF_THE_PARENT_OF_THE_FIRST_BAR_COMMIT..HEAD

এটি প্রতিশ্রুতিবদ্ধ বার্তার শুরুতে "[বার]" যোগ করবে।


যদি মূল সংগ্রহস্থলটিতে শাখা এবং মার্জ থাকে git amতবে সম্ভবত এটি ব্যর্থ হবে।
অ্যাডাম মনসেন

1
অপ্রাপ্তবয়স্ক গেটচা: [ ]কমিট ম্যাসেজ থেকে গিট অ্যাম কিছু বাদ দেয়। সুতরাং আপনার [bar]
এইচআরজে

আমার পক্ষে কাজ করেনি। পেয়েছি "ত্রুটি: foobar / mySubDir / test_host1: সূচীতে উপস্থিত নেই failed ব্যর্থ প্যাচটির অনুলিপিটি পাওয়া যায়: /home/myuser/src/proj/.git/rebase-apply/patch আপনি যখন এই সমস্যার সমাধান করেছেন তখন , চালান "Git টা --continue" এই ছিল 11 প্যাচ (60 মধ্যে) প্রয়োগের
oligofren থেকে

1
এই ব্লগটির কিছুটা আলাদা প্রশ্নের একই উত্তর রয়েছে (কেবলমাত্র নির্বাচিত ফাইলগুলি মুভিং করা)।
জেসি গ্লিক

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

8

এই ফাংশনটি স্থানীয় রেপো দিরের মধ্যে রিমোট রেপো ক্লোন করবে, মার্জ করার পরে সমস্ত প্রতিশ্রুতি সংরক্ষণ করা git logহবে , আসল প্রতিশ্রুতি এবং সঠিক পথ প্রদর্শন করা হবে:

function git-add-repo
{
    repo="$1"
    dir="$(echo "$2" | sed 's/\/$//')"
    path="$(pwd)"

    tmp="$(mktemp -d)"
    remote="$(echo "$tmp" | sed 's/\///g'| sed 's/\./_/g')"

    git clone "$repo" "$tmp"
    cd "$tmp"

    git filter-branch --index-filter '
        git ls-files -s |
        sed "s,\t,&'"$dir"'/," |
        GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info &&
        mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
    ' HEAD

    cd "$path"
    git remote add -f "$remote" "file://$tmp/.git"
    git pull "$remote/master"
    git merge --allow-unrelated-histories -m "Merge repo $repo into master" --edit "$remote/master"
    git remote remove "$remote"
    rm -rf "$tmp"
}

ব্যবহারবিধি:

cd current/package
git-add-repo https://github.com/example/example dir/to/save

যদি সামান্য পরিবর্তন হয় আপনি ফাইলগুলি / মার্জ করা রেপোগুলিকে বিভিন্ন পথেও স্থানান্তর করতে পারেন, উদাহরণস্বরূপ:

repo="https://github.com/example/example"
path="$(pwd)"

tmp="$(mktemp -d)"
remote="$(echo "$tmp" | sed 's/\///g' | sed 's/\./_/g')"

git clone "$repo" "$tmp"
cd "$tmp"

GIT_ADD_STORED=""

function git-mv-store
{
    from="$(echo "$1" | sed 's/\./\\./')"
    to="$(echo "$2" | sed 's/\./\\./')"

    GIT_ADD_STORED+='s,\t'"$from"',\t'"$to"',;'
}

# NOTICE! This paths used for example! Use yours instead!
git-mv-store 'public/index.php' 'public/admin.php'
git-mv-store 'public/data' 'public/x/_data'
git-mv-store 'public/.htaccess' '.htaccess'
git-mv-store 'core/config' 'config/config'
git-mv-store 'core/defines.php' 'defines/defines.php'
git-mv-store 'README.md' 'doc/README.md'
git-mv-store '.gitignore' 'unneeded/.gitignore'

git filter-branch --index-filter '
    git ls-files -s |
    sed "'"$GIT_ADD_STORED"'" |
    GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info &&
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' HEAD

GIT_ADD_STORED=""

cd "$path"
git remote add -f "$remote" "file://$tmp/.git"
git pull "$remote/master"
git merge --allow-unrelated-histories -m "Merge repo $repo into master" --edit "$remote/master"
git remote remove "$remote"
rm -rf "$tmp"

নোটিশ পাথগুলি এর
মাধ্যমে প্রতিস্থাপন করে sed, তাই নিশ্চিত হয়ে নিন যে এটি মার্জ হওয়ার পরে সঠিক পথে সরানো হয়েছে। প্যারামিটার শুধুমাত্র Git> = 2.9 থেকে বিদ্যমান।
--allow-unrelated-histories


2
ওএস এক্স লোকদের জন্য, ফাংশনটি কাজ gnu-sedকরতে ইনস্টল করুন git-add-repo। আবারও ধন্যবাদ আন্দ্রে!
ptaylor

7

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

আপনার উত্স ভাণ্ডারে বিভক্ত সাবফোল্ডারটিকে একটি নতুন শাখায় পরিণত করুন

git subtree split --prefix=<source-path-to-merge> -b subtree-split-result

আপনার গন্তব্য রেपो বিভক্ত ফলাফল শাখায় মার্জ

git remote add merge-source-repo <path-to-your-source-repository>
git fetch merge-source-repo
git merge -s ours --no-commit merge-source-repo/subtree-split-result
git read-tree --prefix=<destination-path-to-merge-into> -u merge-source-repo/subtree-split-result

আপনার পরিবর্তনগুলি যাচাই করুন এবং প্রতিশ্রুতিবদ্ধ

git status
git commit

ভুলে যাবেন না

subtree-split-resultশাখাটি মুছে ফেলে পরিষ্কার করুন

git branch -D subtree-split-result

উত্স রেপো থেকে ডেটা আনার জন্য আপনি যে রিমোটটি যুক্ত করেছেন সেটিকে সরান

git remote rm merge-source-repo


3

আমি কিছুটা সহজ বলে মনে করি বলে অন্য উত্তর যুক্ত করা হচ্ছে। Repo_dest এর একটি টান repo_to_import এ করা হয় এবং তারপরে একটি ধাক্কা --set-upstream url: repo_dest মাস্টার সম্পন্ন হয়।

এই পদ্ধতিটি আমার জন্য বেশ কয়েকটি ছোট রেপো একটি বড় আকারে আমদানি করার জন্য কাজ করেছে।

কীভাবে আমদানি করবেন: repo1_to_impo to repo_dest

# checkout your repo1_to_import if you don't have it already 
git clone url:repo1_to_import repo1_to_import
cd repo1_to_import

# now. pull all of repo_dest
git pull url:repo_dest
ls 
git status # shows Your branch is ahead of 'origin/master' by xx commits.
# now push to repo_dest
git push --set-upstream url:repo_dest master

# repeat for other repositories you want to import

আপনি আমদানি করার আগে ফাইল এবং ডায়ার্সকে মূল রেপোগুলিতে পছন্দসই অবস্থানে নতুন নাম দিন বা সরান move যেমন

cd repo1_to_import
mkdir topDir
git add topDir
git mv this that and the other topDir/
git commit -m"move things into topDir in preparation for exporting into new repo"
# now do the pull and push to import

নিম্নলিখিত লিঙ্কে বর্ণিত পদ্ধতিটি এই উত্তরটিকে অনুপ্রাণিত করেছে। এটি আরও সহজ বলে মনে হওয়ায় এটি পছন্দ করেছি। তবে সাবধান! ড্রাগন আছে! https://help.github.com/articles/importing-an-extern-git-repository git push --mirror url:repo_dest আপনার স্থানীয় রেপো ইতিহাস এবং রাজ্যকে রিমোটে স্থান দেয় (url: repo_dest)। তবে এটি রিমোটের পুরানো ইতিহাস এবং অবস্থা মুছে দেয়। মজা নিশ্চিত! : -E


1

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

ALL_COMMITS=$(git log --reverse --pretty=format:%H -- ZZZ | tr '\n' ' ')

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

git cherry-pick $ALL_COMMITS

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


1

দেখুন বেসিক উদাহরণ মধ্যে এই নিবন্ধটি ও সংগ্রহস্থলের এই ধরনের ম্যাপিং বিবেচনা করুন:

  • A<-> YYY,
  • B <-> XXX

এই অধ্যায়ে বর্ণিত সমস্ত ক্রিয়াকলাপের পরে (মার্জ হওয়ার পরে), শাখাটি সরান B-master:

$ git branch -d B-master

তারপরে, পরিবর্তনগুলি ধাক্কা।

এটা আমার জন্য কাজ করে.


0

আমি এমন পরিস্থিতিতে ছিলাম যেখানে আমি খুঁজছিলাম -s theirsতবে অবশ্যই, এই কৌশলটির অস্তিত্ব নেই। আমার ইতিহাসটি হ'ল আমি গিটহাবের উপর একটি প্রকল্প তৈরি করেছি এবং এখন কোনও কারণে আমার স্থানীয় masterসাথে একত্রীকরণ করা যায়নিupstream/master যদিও আমি এই শাখায় কোনও স্থানীয় পরিবর্তন না করে। (সত্যিই সেখানে কী ঘটেছিল তা জানেন না - আমার ধারণা অনুমান করা হয়েছে যে প্রবাহগুলি পর্দার আড়ালে কিছু নোংরা ঠেলাঠেলি করেছিল, সম্ভবত?)

আমি যা করে শেষ করেছি তা হ'ল

# as per https://help.github.com/articles/syncing-a-fork/
git fetch upstream
git checkout master
git merge upstream/master
....
# Lots of conflicts, ended up just abandonging this approach
git reset --hard   # Ditch failed merge
git checkout upstream/master
# Now in detached state
git branch -d master # !
git checkout -b master   # create new master from upstream/master

সুতরাং এখন আমার masterসাথে আবার সিঙ্ক হয় upstream/master(এবং আপনি অন্য যে কোনও শাখার জন্য একইভাবে সিঙ্ক করতে চান তার জন্য আপনি উপরেরটি পুনরাবৃত্তি করতে পারেন)।


1
একটি git reset --hard upstream/masterআপনার স্থানীয় উপর masterশাখা কাজ করবে। এইভাবে আপনি স্থানীয় শাখার সংঘাতটি হারাবেন না - ডিফল্ট প্রবাহের মতো জিনিস।
টমেকভি

0

আমি আপনার সমস্যার জন্য আরও একটি সমাধান ( গিট-সাবমডিউলগুলির বিকল্প ) পরামর্শ দিতে পারি - গিল (গিট লিঙ্কস) সরঞ্জাম

এটি জটিল গিট সংগ্রহস্থলগুলির নির্ভরতাগুলি বর্ণনা ও পরিচালনা করতে দেয়।

এছাড়াও এটি গিট रिकर्सিভ সাবমডিউলগুলি নির্ভরতা সমস্যার সমাধান দেয়

আপনার নিম্নলিখিত প্রকল্প নির্ভরতা বিবেচনা করুন: নমুনা গিট সংগ্রহস্থল নির্ভরতা গ্রাফ

তারপরে আপনি .gitlinksসংগ্রহস্থল সম্পর্কিত বিবরণ দিয়ে ফাইলটি সংজ্ঞায়িত করতে পারেন :

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

প্রতিটি লাইন নিম্নলিখিত বিন্যাসে গিট লিঙ্ক বর্ণনা করে:

  1. সংগ্রহস্থলের অনন্য নাম
  2. সংগ্রহস্থলের সম্পর্কিত পাথ (.gitlinks ফাইলের পথ থেকে শুরু হয়েছে)
  3. গিট সংগ্রহস্থল যা চেকআউট করার জন্য গিট ক্লোন কমান্ড রেপোজিটরি শাখায় ব্যবহৃত হবে
  4. # দিয়ে শুরু করা খালি লাইন বা লাইনটি পার্স করা হয় না (মন্তব্য হিসাবে বিবেচিত)।

শেষ পর্যন্ত আপনাকে আপনার মূলের নমুনা সংগ্রহস্থলটি আপডেট করতে হবে:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

ফলস্বরূপ আপনি সমস্ত প্রয়োজনীয় প্রকল্পগুলি ক্লোন করবেন এবং যথাযথভাবে একে অপরের সাথে লিঙ্ক করবেন।

শিশু লিঙ্কযুক্ত সংগ্রহস্থলের সমস্ত পরিবর্তনের সাথে আপনি যদি কিছু সংগ্রহস্থলের সমস্ত পরিবর্তন করতে চান তবে আপনি এটি একটি একক আদেশ দ্বারা করতে পারেন:

gil commit -a -m "Some big update"

টানুন, পুশ কমান্ডগুলি একইভাবে কাজ করে:

gil pull
gil push

গিল (গিট লিঙ্কস) সরঞ্জামটি নিম্নলিখিত কমান্ডগুলিকে সমর্থন করে:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

গিট রিকার্সি সাবমডিউলগুলি নির্ভরতা সমস্যা সম্পর্কে আরও ।


0

আমাকে নাম ব্যবহার a(স্থানে XXXএবং ZZZএবং) b(স্থানে YYY,) থেকে যে বর্ণনা তোলে অল্প সহজ পড়তে।

আপনি সংগ্রহস্থলের একত্রীকরণ করতে চান বলুন aমধ্যে b(আমি অভিমানী করছি তারা একে অন্যকে পাশাপাশি অবস্থিত করছি):

cd a
git filter-repo --to-subdirectory-filter a
cd ..
cd b
git remote add a ../a
git fetch a
git merge --allow-unrelated-histories a/master
git remote remove a

এই জন্য প্রয়োজন git-filter-repoইনস্টল ( filter-branchহয় নিরুৎসাহিত )।

2 টি বড় সংগ্রহস্থল মার্জ করার একটি উদাহরণ, এর মধ্যে একটিকে উপ-ডিরেক্টরিতে রেখে: https://gist.github.com/x-yuri/9890ab1079cf4357d6f269d073fd9731

এটি এখানে আরও


-1

আমি এটি করার সহজ উপায় জানি না। আপনি এটি করতে হবে:

  1. XXX সংগ্রহস্থলে একটি ZZZ সুপার ডিরেক্টরি যুক্ত করতে গিট ফিল্টার-শাখা ব্যবহার করুন
  2. YYY সংগ্রহস্থলে নতুন শাখাটি পুশ করুন
  3. YYY এর ট্রাঙ্কের সাথে ধাক্কা দেওয়া শাখাটি মার্জ করুন।

যদি তা আবেদনময়ী মনে হয় তবে আমি বিশদ সহ সম্পাদনা করতে পারি।


-2

আমি মনে করি আপনি 'গিট এমভি' এবং 'গিট টান' ব্যবহার করে এটি করতে পারেন।

আমি মোটামুটি গিট নুব - সুতরাং আপনার মূল ভান্ডার সম্পর্কে সাবধানতা অবলম্বন করুন - তবে আমি কেবল এটি একটি টেম্পার সায়ারে চেষ্টা করেছিলাম এবং এটি কাজ করে বলে মনে হচ্ছে।

প্রথম - YYY এর মধ্যে থাকা অবস্থায় আপনি এটি কীভাবে দেখতে চান তা মেলানোর জন্য XXX এর কাঠামোর নাম পরিবর্তন করুন:

cd XXX
mkdir tmp
git mv ZZZ tmp/ZZZ
git mv tmp ZZZ

এখন XXX এর মতো দেখাচ্ছে:

XXX
 |- ZZZ
     |- ZZZ

পরিবর্তনগুলি আনতে এখন 'গিট টান' ব্যবহার করুন:

cd ../YYY
git pull ../XXX

এখন YYY এর মতো দেখাচ্ছে:

YYY
 |- ZZZ
     |- ZZZ
 |- (other folders that already were in YYY)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.