প্রবাহ প্রকল্পের বাহিনীকে মাস্টারের দিকে ঠেলে দেওয়ার পরে আমি কীভাবে গিট সাবট্রি ঠিক করব?


13

আমি গিট সাবট্রি ব্যবহার করে পরীক্ষা নিরীক্ষা করেছি এবং নিম্নলিখিত পরিস্থিতিতে চলে এসেছি।

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

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

সাবট্রির নতুন ইতিহাস প্রতিবিম্ব করতে আমি কীভাবে আমার সংগ্রহস্থল আপডেট করতে পারি?

আমার প্রথম প্রচেষ্টা ছিল সাবট্রি এবং সমস্ত ইতিহাস সম্পূর্ণরূপে মুছে ফেলার জন্য ফিল্টার-শাখা ব্যবহার করা।

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD

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

হালনাগাদ

আমি একটি ন্যূনতম প্রজননযোগ্য উদাহরণ তৈরি করার পদক্ষেপগুলি লিখেছি।

  1. প্রথমে একটি খালি গিট রেপো তৈরি করুন।

    git init test-monorepo
    cd ./test-monorepo
    
  2. একটি প্রাথমিক প্রতিশ্রুতি তৈরি করুন।

    echo hello world > README
    git add README
    git commit -m 'initial commit'
    
  3. একটি বাহ্যিক প্রকল্পের জন্য এখন একটি সাবট্রি যুক্ত করুন।

    git remote add thirdparty git@github.com:teivah/algodeck.git
    git fetch thirdparty
    git subtree add --prefix algodeck thirdparty master
    
  4. মনোরপোতে কিছু কমিট করুন

    echo dont panic >> algodeck/README.md
    git commit -a -m 'test commit'
    
  5. সাবট্রিটি সরানোর জন্য এখন গিট ফিল্টার-শাখা ব্যবহারের চেষ্টা করুন।

    git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
    
  6. গিট লগ আউটপুট পরীক্ষা করুন, আমি কেবলমাত্র আমার প্রাথমিক প্রতিশ্রুতি দেখার আশা করছি am

    git log
    

আপনি কি পুরানো কমিটগুলি ফেলে দেওয়ার জন্য এখন gc --prune = গিট দেওয়ার চেষ্টা করেছেন? পুরানো সংস্করণে কিছু রেফ রয়েছে?
দামিয়ানো

1
আমি এটি এখনও চেষ্টা করে দেখিনি, তবে git gc --prune=nowকেবল উপস্থিত না হওয়া কমিটগুলি মুছে ফেলব না git log?
csnate

গিট শাখা-সমস্ত ব্যবহার করে (আমি মনে করি আপনি "পুরাতন" কমিটগুলি দেখতে ব্যবহার করছেন) এছাড়াও আপনার বর্তমান শাখার সাথে সম্পর্কিত না হওয়া কমিটগুলি দেখানো উচিত।
দামিয়ানো

1
আসলে, আমি কেবল করছিলাম git log, কোনও যুক্তি নেই এবং আমি এখনও পুরানো প্রতিশ্রুতিগুলি দেখতে পাচ্ছি।
21-22 এ সিএসনেট

আপনি কি আপনার গিট লগ পোস্ট করতে পারেন - ব্যাখ্যা - সমস্ত - অনুগ্রহ? কেবল আপনার পরিস্থিতি বুঝতে
ড্যামিয়ানো

উত্তর:


0

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

ধরে নেওয়া যাক আপনি পেয়েছেন master শেষ প্রতিশ্রুতিবদ্ধ হয়ে গেছেন এবং অন্য কিছু করতে সক্ষম হন নি (সত্যই আমার কাছে আপনার শাখা নেই, তাই আমার সাথে কিছু শুরু করার দরকার আছে)

আপনি পূর্বের প্রতিশ্রুতিতে চেকআউট করতে পারেন এবং আপনার শাখা চিহ্নিতকারীকে 1 ধাপ পিছনে (বা এক্স ধাপ পিছনে) ধাক্কা দিতে পারেন যা কোনও ক্ষেত্রে নিরীহ হতে পারে এবং তারপরে আবার টানতে পারে

যেমন

git checkout master~1
git branch master -f
git checkout master
git pull
  1. git checkout master~1 মাস্টারের পিতামাতার প্রতিশ্রুতি চেকআউট করতে, গিট সতর্ক করে দেয় আমরা শাখা বন্ধ করে দিই
  2. git branch master -f বর্তমান চেকআউটটিকে আবার মাস্টার হয়ে উঠতে বাধ্য করা, অর্থাৎ এটি প্রকৃতপক্ষে তার পূর্ববর্তী কমিট (বা এক্স পূর্ববর্তী প্রতিশ্রুতি) এর সাথে মাস্টার ব্রাঞ্চকে রিন্ডাইন্ড করে, এবং এখান থেকে, আপস্রোম কোনও বাহিনী করেছে কিনা তা আমাদের বিবেচ্য বিষয় নয়, আমরা স্বাভাবিকভাবে আবার শুরু করতে পারি, বা এমনকি প্রয়োজনে উপরের পদক্ষেপে ফিরে যান, উজান থেকে কোনও কিছু না হারিয়ে আমরা কেবলমাত্র আবার মাস্টারকে টানতে পারি (যা আমাদের পক্ষে কেবল পঠনযোগ্য হতে পারে, আমরা এর জন্য কিছুতেই চাপ দিচ্ছি না)
  3. git checkout master আমাদের "রিবাউন্ড" মাস্টার শাখায় থাকার জন্য, একই প্রতিশ্রুতিতে আমরা পদক্ষেপ নিচ্ছি, তবে এখন পরিবর্তে এখন শাখায় আছি
  4. git pullআবার মাস্টার টানতে (সাথে বা তার --pruneবাইরেও হতে পারে ), যদি উজানে ডাইভার্ট করা হয় তবে আমরা এখান থেকে আবার ট্রাকে ফিরে যাব, যদি না হয় তবে আমরা আমাদের যা পেয়েছিলাম তা পেয়ে যাব, যদি আমাদের একই রকম হয় এবং অনুমিত না হয়, সম্ভবত আমরা উপরের প্রথম পদক্ষেপে ফিরে যেতে হবে এবং আরও কমিটগুলি রিওয়াইন্ড করতে হবে, যেমন git checkout master~5বা যা কিছু (প্রয়োজন হিসাবে)

আমি মনে করি না এই সঙ্গে কাজ করবে নাgit subtree
csnate

@csnate এটি একটি subrepo থেকে পূর্ববর্তী করে চেকআউট এবং অনুরূপ পদ্ধতি অনুসরণ, যদি আপনি একটি MCVE গড়ে তুলতে আপনার সঠিক কমান্ড বলতে অনুসরণ করতে সহজ হবে করা সম্ভব stackoverflow.com/help/minimal-reproducible-example
arhak

আমি গিটহাবে একটি নমুনা রেপো তৈরির চেষ্টা করব।
csnate

আমি আসল প্রশ্নের মধ্যে ধাপের একটি সেট তৈরি করেছি যা সমস্যাটি দেখায়।
csnate

0
  1. আপনার রেপোতে, এই রিমোটটির জন্য দায়বদ্ধতার ইতিহাস সাফ করুন:

    git fetch upstream
    
  2. যদি আপনার নিজের কমিটের একটিতে যদি কমিট থাকে তবে এতে বড় ফাইল অন্তর্ভুক্ত থাকে, আপনার ইতিহাসটি আবারও লিখুন যাতে এই বড় ফাইলটির আর উল্লেখ না হয়

    # using one or more of the following commands :
    git rebase --interactive
    git filter-branch
    ...
    

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


আপনার হার্ড ড্রাইভ থেকে এই বড় ফাইলটি ASAP মোছার জরুরি প্রয়োজন হলে:

ম্যানুয়ালি চালান

git gc --prune=now
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.