একটি ফোল্ডার থেকে একটি সাব মডুলার সংগ্রহশালা তৈরি করুন এবং এর গিট কমিটের ইতিহাস রাখুন


111

আমার একটি ওয়েব অ্যাপ্লিকেশন রয়েছে যা অন্য ওয়েব অ্যাপ্লিকেশনগুলিকে একটি নির্দিষ্ট উপায়ে অন্বেষণ করে। এটিতে একটি demosফোল্ডারে কিছু ওয়েব ডেমো রয়েছে এবং ডেমোগুলির একটিতে এখন এটির নিজস্ব সংগ্রহস্থল থাকা উচিত। আমি এই ডেমো অ্যাপ্লিকেশনটির জন্য একটি পৃথক সংগ্রহস্থল তৈরি করতে এবং এটির একটি তৈরি করতে চাইসাবপ্যাকেজ কমান্ডের ইতিহাস হারিয়ে না ফেলে মূল সংগ্রহস্থল থেকে সাবমডিউল

ফাইলগুলি থেকে কোনও প্রতিবেদনের ফোল্ডারে রেখে প্রতিশ্রুতিবদ্ধ ইতিহাসটি রাখা এবং সেখান থেকে একটি সংগ্রহশালা তৈরি করা এবং পরিবর্তে এটি একটি উপমোডি হিসাবে ব্যবহার করা সম্ভব ?


আমি নিবন্ধটির লিঙ্কটির জন্য কীভাবে ডিরেক্টরি 1 গিট সংগ্রহস্থল A থেকে গিট সংগ্রহস্থল বি +1 এ স্থানান্তর করতে চাইছি তা অনুসন্ধান করছি।
চিতাবাহন

1
প্রতিলিপি? stackoverflow.com/questions/12514197/...
naught101

হ্যাঁ এটি সত্যই একই রকম, সমাধানগুলি কিছুটা পৃথক, ভাগ করে নেওয়ার জন্য ধন্যবাদ
গ্যাবলেউক্স

উত্তর:


191

বিস্তারিত সমাধান

এনপিএম ব্যবহার করে গিট সাবমোডিয়ুলের দ্রুত বিকল্পের জন্য এই উত্তরের শেষে শেষ নোটটি দেখুন (শেষ অনুচ্ছেদ);)

নিম্নলিখিত উত্তরে আপনি কীভাবে একটি সংগ্রহস্থল থেকে একটি ফোল্ডারটি বের করতে এবং সেখান থেকে একটি গিটার সংগ্রহস্থল তৈরি করতে এবং তারপরে এটি ফোল্ডারের পরিবর্তে সাবমোডিয়াল হিসাবে অন্তর্ভুক্ত করবেন know

জার্গ বায়ারের নিবন্ধ থেকে অনুপ্রাণিত হয়ে একটি গিট রিপোজিটরি থেকে অন্যটিতে ফাইল সংরক্ষণ করা, ইতিহাস সংরক্ষণ করা

শুরুতে, আমাদের এর মতো কিছু রয়েছে:

<git repository A>
    someFolders
    someFiles
    someLib <-- we want this to be a new repo and a git submodule!
        some files

পদক্ষেপে নম্র, আমি এটি someLibহিসাবে উল্লেখ করব <directory 1>

শেষে, আমাদের এর মতো কিছু থাকবে:

<git repository A>
    someFolders
    someFiles
    @submodule --> <git repository B>

<git repository B>
    someFolders
    someFiles

অন্য সংগ্রহস্থলের একটি ফোল্ডার থেকে একটি নতুন গিট সংগ্রহস্থল তৈরি করুন

ধাপ 1

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

git clone <git repository A url>
cd <git repository A directory>

ধাপ ২

বর্তমান ফোল্ডারটি নতুন সংগ্রহস্থল হবে সুতরাং বর্তমানের রিমোটটি সরিয়ে ফেলুন।

git remote rm origin

ধাপ 3

পছন্দসই ফোল্ডারের ইতিহাস বের করুন এবং এটি প্রতিশ্রুতিবদ্ধ

git filter-branch --subdirectory-filter <directory 1> -- --all

directory 1আপনার রেপোর মূল থেকে সমস্ত সম্পর্কিত কমিটের ইতিহাস সহ ফাইলগুলির সাথে এখন একটি গিট সংগ্রহস্থল থাকা উচিত ।

পদক্ষেপ 4

আপনার অনলাইন সংগ্রহস্থল তৈরি করুন এবং আপনার নতুন ভান্ডারটি পুশ করুন!

git remote add origin <git repository B url>
git push

upstreamআপনার প্রথম ধাক্কার জন্য আপনাকে শাখাটি স্থাপন করতে হবে

git push --set-upstream origin master

পরিষ্কার <git repository A>(alচ্ছিক, মন্তব্য দেখুন)

আমরা এই ফোল্ডারের জন্য ইতিহাস <git repository B>থেকে এর ট্রেস (ফাইল এবং ইতিহাস প্রতিশ্রুতিবদ্ধ) মুছে ফেলতে চাই <git repository A>there

এটি গিথুব থেকে সংবেদনশীল ডেটা অপসারণের উপর ভিত্তি করে ।

একটি নতুন ফোল্ডারে যান এবং

git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all

<directory 1>আপনি যে ফোল্ডারটি সরাতে চান সেটি দ্বারা প্রতিস্থাপন করুন । -rএটি নির্দিষ্ট ডিরেক্টরি ভিতরে পুনরাবৃত্তভাবে কাজ করবে :)। এখন থেকে ধাক্কা origin/masterদিয়ে--force

git push origin master --force

বস স্টেজ (নীচের নোট দেখুন)

একটি তৈরি করুন submodule থেকে <git repository B>মধ্যে<git repository A>

git submodule add <git repository B url>
git submodule update
git commit

সবকিছু প্রত্যাশা অনুযায়ী কাজ করেছে কিনা তা যাচাই করুন push

git push origin master

বিঃদ্রঃ

এই সমস্ত কিছু করার পরে, আমি আমার ক্ষেত্রে বুঝতে পারি যে তার পরিবর্তে নিজের নির্ভরতাগুলি পরিচালনা করতে এনপিএম ব্যবহার করা আরও উপযুক্ত । আমরা গিট ইউআরএল এবং সংস্করণগুলি নির্দিষ্ট করতে পারি, প্যাকেজ.জসন গিট ইউআরএলকে নির্ভরতা হিসাবে দেখি ।

আপনি এটি এই ভাবে না, সংগ্রহস্থলের আপনি একটি প্রয়োজন হিসাবে ব্যবহার করতে চান একটি হওয়া আবশ্যক npm মডিউল তাই এটি একটি থাকা আবশ্যক package.jsonফাইল বা এই ত্রুটি পাবেন: Error: ENOENT, open 'tmp.tgz-unpack/package.json'

tldr (বিকল্প সমাধান)

আপনি এনএমপি ব্যবহার এবং গিট ইউআরএলগুলির সাথে নির্ভরতা পরিচালনা করা আরও সহজ পেতে পারেন :

  • ফোল্ডারটিকে একটি নতুন ভাণ্ডারে সরান
  • npm initউভয় ভান্ডার ভিতরে চালান
  • npm install --save git://github.com/user/project.git#commit-ishআপনি যেখানে নির্ভরতা ইনস্টল করতে চান সেখানে চালান

39
পদক্ষেপ "ক্লিন <গিট সংগ্রহস্থল এ>" এড়ানো উচিত। এটি করার মাধ্যমে আপনি পুরানো সংস্করণগুলি / পুনরুদ্ধার করতে পারবেন না / আপনার ইতিহাস থেকে কমিটগুলি প্রতিস্থাপন করতে পারেন। আপনার কেবল ফোল্ডারটি গিটার করা উচিত এবং সাবমডিউলটি যুক্ত করা উচিত। সুতরাং আপনি পুরানো কমিটগুলি যাচাই করার সময় পুরোপুরি কার্যকরী অনুলিপিটি নিশ্চিত করেছেন।
সাইবট

cd someLibপদক্ষেপ 2 এর আগে আপনার করা উচিত নয় ? আপনি বলছেন "বর্তমান ফোল্ডারটি নতুন সংগ্রহস্থল হবে" তবে বাস্তবে তা হবে না; নতুন ভাণ্ডার (সাবমডিউল) সেই ফোল্ডারের ভিতরে রয়েছে
জাগো

1
নিশ্চিতকরণ: হ্যাঁ, এটি একাধিক সাবমডিউলের জন্য কাজ করে। বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ। এছাড়াও, এনপিএম ব্যবহার করতে হবে না।
ব্রেণো ইনোজোসা

2
আমি যা পদক্ষেপ 3 এ তৈরি করা হয়েছে সে সম্পর্কে তথ্য যুক্ত করবrefs/original/...
এমিল বার্গারন

6
গিটহাব কীভাবে একটি ফোল্ডারের এক্সট্রাকশনটিকে একটি নতুন সংগ্রহস্থলে রূপান্তর করতে পারেন সে সম্পর্কে একটি নিবন্ধ তৈরি করেছেন: গিটিহাব কীভাবে ভাণ্ডারটিতে help.github.com/articles/…
জ্রোবিচাউড

9

@ গ্যাবলেউক্সের সমাধানটি শাখাগুলিকে স্কোয়াশ করে এবং সম্পর্কিত প্রতিশ্রুতি দেয়।

এই সমস্ত অতিরিক্ত শাখা এবং প্রতিশ্রুতিবদ্ধ করতে এবং ক্লোন করার সহজ উপায়:

1 - নিশ্চিত করুন যে আপনার এই গিটের নাম আছে

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2 - রিমোটটি ক্লোন করুন, সমস্ত শাখা টানুন, রিমোট পরিবর্তন করুন, আপনার ডিরেক্টরি ফিল্টার করুন, ধাক্কা দিন

git clone git@github.com:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin git@github.com:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags

3

আপনি যদি git lfsআলাদা করতে চান সেই ডিরেক্টরিটির অধীনে যদি আপনি বড় ফাইল ব্যবহার করেন এবং গ্যাবলেউক্সের সমাধানটি ভাল কাজ করে । সেক্ষেত্রে ৩ য় ধাপের পরে সমস্ত বড় ফাইল রিয়েল ফাইলের পরিবর্তে পয়েন্টার ফাইল হিসাবে থাকবে। আমি সম্ভবত এটি কারণে কারণ.gitattributes ফিল্টার শাখা প্রক্রিয়াতে ফাইলটি সরিয়ে ।

এটি উপলব্ধি করে, আমি নিম্নলিখিত সমাধানগুলি আমার জন্য কাজ করে দেখতে পেলাম:

cp .gitattributes .git/info/attributes

মুছে যাওয়া এড়ানোর .gitattributesজন্য কোন গিট এলএফএস বড় ফাইলগুলি .git/ডিরেক্টরিতে ট্র্যাক করতে ব্যবহার করে তা অনুলিপি করা হচ্ছে।

ফিল্টার- .gitattributesব্রাঞ্চটি করা হয়ে গেলে আপনি যদি এখনও নতুন সংগ্রহশালার জন্য গিট এলএফএস ব্যবহার করতে চান তবে তা পিছনে রাখতে ভুলবেন না :

mv .git/info/attributes .gitattributes
git add .gitattributes
git commit -m 'added back .gitattributes'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.