অনেকগুলি উপ-ডিরেক্টরিকে নতুন, পৃথক গিট সংগ্রহস্থলে আলাদা করুন


135

এই প্রশ্নটি পৃথক গিট সংগ্রহস্থলে ডিটাচ সাব-ডিরেক্টরিতে ভিত্তিক

একটি একক উপ-ডিরেক্টরিকে বিচ্ছিন্ন করার পরিবর্তে, আমি একটি দম্পতিকে আলাদা করতে চাই। উদাহরণস্বরূপ, আমার বর্তমান ডিরেক্টরি গাছটি দেখতে এমন দেখাচ্ছে:

/apps
  /AAA
  /BBB
  /CCC
/libs
  /XXX
  /YYY
  /ZZZ

এবং পরিবর্তে আমি এটি চাই:

/apps
  /AAA
/libs
  /XXX

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

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

কোন ধারনা? টিয়া

উত্তর:


155

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

git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA libs/XXX' --prune-empty -- --all

যেমনটি তার / তার মন্তব্যে void.pointer দ্বারা উল্লিখিত হয়েছে , এটি বর্তমান সংগ্রহশালা ব্যতীত এবং সমস্ত কিছু সরিয়ে ফেলবে ।apps/AAAlibs/XXX

খালি মার্জ কমিট ছাঁটাই

এটি প্রচুর খালি মার্জগুলির পিছনে ফেলে। এগুলি তার উত্তরে রাফিনেসের বর্ণনা অনুসারে অন্য একটি পাস দিয়ে মুছে ফেলা যেতে পারে :

git filter-branch --prune-empty --parent-filter \
'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'

⚠️ সতর্কতা : উপরেরগুলির অবশ্যই GNU সংস্করণটি ব্যবহার করা উচিত sedএবং xargsঅন্যথায় এটি xargsব্যর্থ হওয়ায় সমস্ত কমান্ড অপসারণ করবে । brew install gnu-sed findutilsএবং তারপর ব্যবহার gsedএবং gxargs:

git filter-branch --prune-empty --parent-filter \
'gsed "s/-p //g" | gxargs git show-branch --independent | gsed "s/\</-p /g"' 

4
অতিরিক্ত হিসাবে, --ignore-unmatch পতাকাটি গিট আরএম-এ প্রেরণ করা উচিত, এটি আমার পক্ষে প্রথম প্রতিশ্রুতির জন্য ব্যর্থ হয় অন্যথায় (আমার ক্ষেত্রে গিট এসএনএন ক্লোন দিয়ে
ভান্ডারটি

8
এই মিশ্রণটিতে আপনার ট্যাগ রয়েছে বলে ধরে নেওয়া, --tag-name-filter catআপনার প্যারামিটারগুলিতে সম্ভবত যুক্ত করা উচিত
যোনাতান

16
এই দীর্ঘ আদেশটি কী করছে তা বোঝাতে আপনি আরও কিছু তথ্য যুক্ত করতে পারেন?
বুরহান আলী

4
আমি আনন্দের সাথে অবাক হই যে এই উইন্ডোতে গিট ব্যাশ, ভিজো ব্যবহার করে নিখুঁতভাবে কাজ করে!
দাই

3
@ বুরহানআলি ইতিহাসের প্রতিটি প্রতিশ্রুতিবদ্ধতার জন্য, আপনি যে ফাইলগুলি রাখতে চান তা বাদ দিয়ে এটি সমস্ত ফাইল মুছে ফেলছে। যখন সবকিছু শেষ হয়ে যায়, কেবলমাত্র সেই ইতিহাসের সাথে আপনার নির্দিষ্ট করা গাছের অংশটিই কেবল অবশিষ্ট থাকে।
void.pointer

39

সাধারণ গিট কমান্ড সহ ম্যানুয়াল পদক্ষেপ

পরিকল্পনাটি হ'ল পৃথক ডিরেক্টরিগুলি তার নিজস্ব ভাগে বিভক্ত করা হবে, তারপরে সেগুলি একত্রিত করুন। নিম্নলিখিত ম্যানুয়াল পদক্ষেপগুলি গিক-টু-ব্যবহার স্ক্রিপ্টগুলি নিয়োগ করে না তবে সহজেই বুঝতে সহজ কমান্ডগুলি ব্যবহার করে এবং অতিরিক্ত এন সাব-ফোল্ডারগুলিকে অন্য একক ভান্ডারে একীভূত করতে সহায়তা করতে পারে।

বিভক্ত করা

আসুন অনুমান আপনার মূল রেপো হল: original_repo

1 - স্প্লিট অ্যাপস:

git clone original_repo apps-repo
cd apps-repo
git filter-branch --prune-empty --subdirectory-filter apps master

2 - স্প্লিট libs

git clone original_repo libs-repo
cd libs-repo
git filter-branch --prune-empty --subdirectory-filter libs master

আপনার 2 টিরও বেশি ফোল্ডার থাকলে চালিয়ে যান। এখন আপনার দুটি নতুন এবং অস্থায়ী গিট সংগ্রহস্থল থাকবে ory

অ্যাপ্লিকেশন এবং libs একত্রিত করে জয়

3 - একেবারে নতুন রেপো প্রস্তুত করুন:

mkdir my-desired-repo
cd my-desired-repo
git init

এবং আপনার কমপক্ষে একটি কমিট করতে হবে need নিম্নলিখিত তিনটি লাইন যদি এড়ানো যায় তবে আপনার রেপোটি আপনার রেপোর মূলের নীচে অবিলম্বে উপস্থিত হবে:

touch a_file_and_make_a_commit # see user's feedback
git add a_file_and_make_a_commit
git commit -am "at least one commit is needed for it to work"

টেম্প ফাইলটি কমিট হওয়ার সাথে সাথে, mergeপরবর্তী বিভাগে কমান্ড প্রত্যাশা অনুযায়ী বন্ধ হয়ে যাবে।

ব্যবহারকারীর প্রতিক্রিয়া থেকে নেওয়া, এলোমেলো ফাইলের মতো a_file_and_make_a_commitপছন্দ করার পরিবর্তে আপনি একটি .gitignore, বা README.mdইত্যাদি যুক্ত করতে বেছে নিতে পারেন

4 - অ্যাপ্লিকেশনগুলির রেপো প্রথমে মার্জ করুন:

git remote add apps-repo ../apps-repo
git fetch apps-repo
git merge -s ours --no-commit apps-repo/master # see below note.
git read-tree --prefix=apps -u apps-repo/master
git commit -m "import apps"

এখন আপনার নতুন ভাণ্ডারের ভিতরে অ্যাপ্লিকেশন ডিরেক্টরি দেখতে হবে । git logসমস্ত প্রাসঙ্গিক historicalতিহাসিক প্রতিশ্রুতি বার্তা প্রদর্শন করা উচিত।

দ্রষ্টব্য: ক্রিস যেমন মন্তব্যগুলিতে নীচে উল্লিখিত হয়েছে, গিটের নতুন সংস্করণ (> = 2.9) এর জন্য আপনাকে অবশ্যই এটি উল্লেখ --allow-unrelated-historiesকরতে হবেgit merge

5 - পরের দিকে একই রকমের রেবো মার্জ করুন:

git remote add libs-repo ../libs-repo
git fetch libs-repo
git merge -s ours --no-commit libs-repo/master # see above note.
git read-tree --prefix=libs -u libs-repo/master
git commit -m "import libs"

মার্জ করার জন্য আপনার কাছে 2 টিরও বেশি রেপো থাকলে চালিয়ে যান।

তথ্যসূত্র: গিটের সাথে অন্য সংগ্রহস্থলের একটি উপ-ডিরেক্টরিকে মার্জ করুন


4
গিট ২.৯ যেহেতু আপনাকে মার্জ কমান্ডগুলিতে --ille-সম্পর্কযুক্ত-ইতিহাস ব্যবহার করতে হবে। অন্যথায় এটি আমার পক্ষে ভাল কাজ করেছে বলে মনে হয়।
ক্রিস

1
জিনিয়াস! এই জন্য আপনাকে অনেক ধন্যবাদ. আমি যে প্রাথমিক উত্তরগুলি দেখেছি, খুব বড় সংগ্রহস্থলের উপর একটি ট্রি ফিল্টার ব্যবহার করেছি, গিটটি পুনরায় লেখাগুলি সম্পূর্ণ করতে 26 ঘন্টা ধরে নিয়ে যাওয়ার পূর্বাভাস করেছিল। এই সহজ, তবে পুনরাবৃত্তিযোগ্য পদ্ধতির সাথে অনেক বেশি খুশি এবং 4 টি সাব ফোল্ডারকে সাফল্যের সাথে সমস্ত প্রত্যাশিত প্রতিশ্রুতিবদ্ধ ইতিহাস সহ একটি নতুন রেপোতে স্থানান্তরিত করেছে।
শাটসি

1
আপনি "প্রাথমিক প্রতিশ্রুতি" দেওয়ার জন্য প্রথম প্রতিশ্রুতি ব্যবহার করতে পারেন যা যুক্ত করে .gitignoreএবং README.mdফাইলগুলি।
জ্যাক মিলার

2
দুর্ভাগ্যক্রমে এই পদ্ধতির git merge .. git read-treeপদক্ষেপে যুক্ত হওয়া ফাইলগুলির জন্য ট্র্যাকিং-ইতিহাস ভাঙ্গা মনে হচ্ছে , কারণ এটি এগুলিকে সদ্য যুক্ত হওয়া ফাইল হিসাবে রেকর্ড করে এবং আমার সমস্ত গিট গুইস তাদের পূর্ববর্তী কমিটির সাথে সংযোগ স্থাপন করে না।
দাই

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

27

আপনি কেন filter-branchএকাধিকবার দৌড়াতে চান ? আপনি এটি একটি ঝাড়ু দিয়ে সব করতে পারেন, সুতরাং এটির জন্য জোর করার দরকার নেই (নোট করুন যে এটির extglobকাজ করার জন্য আপনার শেলটিতে সক্ষম হওয়া দরকার ):

git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch $(ls -xd apps/!(AAA) libs/!(XXX))" --prune-empty -- --all

এটি অযাচিত সাব-ডিরেক্টরিতে থাকা সমস্ত পরিবর্তন থেকে মুক্তি পেয়ে আপনার সমস্ত শাখা এবং কমিটগুলি রক্ষা করা উচিত (যদি না কেবল তারা ছাঁটাই করা সাব-ডিরেক্টরিগুলিতে ফাইলগুলিকে প্রভাবিত করে --prune-empty) তবে - সদৃশ কমিট ইত্যাদি সমস্যা নেই etc.

এই ক্রিয়াকলাপের পরে অযাচিত ডিরেক্টরিগুলি তালিকাভুক্ত হিসাবে তালিকাভুক্ত হবে git status

$(ls ...)প্রয়োজনীয় St হয় extglobআপনার পরিবর্তে শেল সূচক ফিল্টার, যা ব্যবহার দ্বারা মূল্যায়ন করা হয় shbuiltin eval(যেখানে extglobপাওয়া যায় না)। গিটে শেল বিকল্পগুলি কীভাবে সক্ষম করব দেখুন দেখুন ? সে সম্পর্কে আরও তথ্যের জন্য।


1
আকর্ষণীয় ধারণা। আমি একই সমস্যা আছে কিন্তু এটি কাজ পাই নি, দেখুন stackoverflow.com/questions/8050687/...
manol

এটি আমার প্রয়োজনমতো খুব প্রয়োজন, যদিও আমার রেপো জুড়ে আমার উভয় ফাইল এবং ফোল্ডার
ছিটানো ছিল

1
HM। এমনকি এক্সট্লোব অন করেও আমি আমার প্রথম বন্ধকের কাছে একটি ত্রুটি পেয়ে যাচ্ছি: অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি '(' আমার কমান্ডটি দেখতে পাওয়া যায়: গিট ফিল্টার-শাখা -f --index-ফিল্টার "গিট আরএম-আর -ফ - ক্যাচড - -ignore-unmatch src / css / થીમ /! (some_theme *) "--pune-খালি - - এসআরসি / সিএসএস / থিমস /! (কিছু_ধর্ম *) সহ সমস্ত এলএস অন্য সমস্ত থিম ফিরিয়ে দেয় যাতে এক্সট্লগব উপস্থিত হয় কাজ করা ...
রবডডসন

2
@ মাইক্রগ্রাফ আমি মনে করি না এটি পছন্দসই ফলাফল দেবে: পালিয়ে যাওয়া আক্ষরিক সাথে মিলবে "!" আপনার পথে ইত্যাদি।
kynan

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

20

আমার নিজের প্রশ্নের উত্তর এখানে দেওয়া হচ্ছে ... অনেক পরীক্ষা এবং ত্রুটির পরে।

আমি git subtreeএবং এর সংমিশ্রণটি ব্যবহার করে এটি পরিচালনা করেছিলাম git-stitch-repo। এই নির্দেশাবলী উপর ভিত্তি করে:

প্রথমে, আমি যে ডিরেক্টরিগুলি তাদের নিজস্ব পৃথক ভাণ্ডারে রাখতে চাইছিলাম তা আমি বের করেছিলাম:

cd origRepo
git subtree split -P apps/AAA -b aaa
git subtree split -P libs/XXX -b xxx

cd ..
mkdir aaaRepo
cd aaaRepo
git init
git fetch ../origRepo aaa
git checkout -b master FETCH_HEAD

cd ..
mkdir xxxRepo
cd xxxRepo
git init
git fetch ../origRepo xxx
git checkout -b master FETCH_HEAD

এরপরে আমি একটি নতুন খালি সংগ্রহস্থল তৈরি করেছি এবং এতে সর্বশেষ দুটি আমদানি / সেলাই করেছি:

cd ..
mkdir newRepo
cd newRepo
git init
git-stitch-repo ../aaaRepo:apps/AAA ../xxxRepo:libs/XXX | git fast-import

এটি দুটি শাখা তৈরি করে, master-Aএবং master-Bপ্রতিটি প্রত্যেকে একটি সেলাই করা রেপসের সামগ্রী রাখে holding তাদের একত্রিত করতে এবং পরিষ্কার করতে:

git checkout master-A
git pull . master-B
git checkout master
git branch -d master-A 
git branch -d master-B

এখন আমি কীভাবে / কখন এটি ঘটে তা পুরোপুরি নিশ্চিত নই, তবে প্রথম checkoutএবং পরে pull, কোডটি যাদুকরীভাবে মাস্টার শাখায় মিশে গেছে (এখানে কী চলছে সে সম্পর্কে কোনও অন্তর্দৃষ্টি প্রশংসিত হয়!)

সবকিছু প্রত্যাশার মতো কাজ করেছে বলে মনে হচ্ছে, যদি আমি newRepoপ্রতিশ্রুতিবদ্ধ ইতিহাসটি দেখি তবে ডুপ্লিকেটগুলি রয়েছে যখন পরিবর্তনটি উভয়কে প্রভাবিত করেছিল apps/AAAএবং libs/XXX। সদৃশ অপসারণের কোনও উপায় যদি থাকে তবে তা নিখুঁত হবে।


আপনি এখানে পরিষ্কার সরঞ্জাম সন্ধান করেছেন। "চেকআউট" এর অন্তর্দৃষ্টি: "গিট টান" "গিট ফেচ অ্যান্ড অ্যান্ড গিট মার্জ" এর সমান। আপনি "স্থানীয়ভাবে আনছেন" যেহেতু "আনয়ন" অংশটি নিষ্প্রভ। সুতরাং আমি মনে করি এই চেকআউট কমান্ডটি "গিট মার্জ মাস্টার-বি" এর সমান, যা কিছুটা স্ব-স্পষ্ট। দেখুন kernel.org/pub/software/scm/git/docs/git-pull.html
phord

1
দুর্ভাগ্যক্রমে আজকাল খারাপ নির্ভরতার কারণে গিট-সেলাই-রেপো সরঞ্জামটি ভেঙে যায়।
হেনরিক

@ হেনরিক আপনি ঠিক কোন সমস্যায় পড়ছিলেন? এটি আমার পক্ষে কাজ করে, যদিও আমাকে export PERL5LIB="$PERL5LIB:/usr/local/git/lib/perl5/site_perl/"আমার ব্যাশ কনফিগারেশনে যুক্ত করতে হয়েছিল যাতে এটি Git.pm খুঁজে পেতে পারে তারপরে আমি এটি সিপিএন দিয়ে ইনস্টল করেছি।

git subtree addএই কাজটি সম্পাদন করতে এটি ব্যবহার করা সম্ভব । দেখুন stackoverflow.com/a/58253979/1894803
laconbass

7

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

https://github.com/slobobaby/git_filter

এটি দুর্দান্ত লিবিগিট 2 এর উপর ভিত্তি করে।

আমার অনেকগুলি কমিট (~ 100000) দিয়ে একটি বৃহত ভাণ্ডার বিভক্ত করা দরকার এবং গিট ফিল্টার-শাখার ভিত্তিতে সমাধানগুলি চালাতে বেশ কয়েক দিন সময় নিয়েছিল। একই কাজ করতে git_filter এক মিনিট সময় নেয়।


7

'গিট বিভক্ত' গিট এক্সটেনশন ব্যবহার করুন

git splitsঝাঁকানো সমাধানেরgit branch-filter উপর ভিত্তি করে একটি গিফ এক্সটেনশন হিসাবে আমি তৈরি করেছি এমন চারপাশে একটি মোড়ক এমন একটি বাশ স্ক্রিপ্ট ।

এটি ঠিক এই পরিস্থিতির জন্য তৈরি করা হয়েছিল। আপনার ত্রুটির git splits -fজন্য, ব্যাকআপটি অপসারণের জন্য জোর করার বিকল্পটি ব্যবহার করে দেখুন । যেহেতু git splitsএকটি নতুন শাখায় কাজ করে, এটি আপনার বর্তমান শাখাকে আবার লিখতে পারে না, তাই ব্যাকআপটি বহিরাগত। আরও বিশদ জন্য রিডমি দেখুন এবং এটি আপনার রেপির অনুলিপি / ক্লোন (অবশ্যই ক্ষেত্রে!) ব্যবহার করার বিষয়ে নিশ্চিত হন

  1. ইনস্টল git splits
  2. ডিরেক্টরিগুলি স্থানীয় শাখায় বিভক্ত করুন #change into your repo's directory cd /path/to/repo #checkout the branch git checkout XYZ
    #split multiple directories into new branch XYZ git splits -b XYZ apps/AAA libs/ZZZ

  3. কোথাও একটি খালি রেপো তৈরি করুন। আমরা ধরে নেব যে আমরা xyzগিটহাবের নামে একটি ফাঁকা রেপো তৈরি করেছি যার পথ রয়েছে:git@github.com:simpliwp/xyz.git

  4. নতুন রেপোতে চাপ দিন। #add a new remote origin for the empty repo so we can push to the empty repo on GitHub git remote add origin_xyz git@github.com:simpliwp/xyz.git #push the branch to the empty repo's master branch git push origin_xyz XYZ:master

  5. নতুন নির্মিত ডিরেক্টরিতে সদ্য নির্মিত রিমোট রেপো ক্লোন করুন
    #change current directory out of the old repo cd /path/to/where/you/want/the/new/local/repo #clone the remote repo you just pushed to git clone git@github.com:simpliwp/xyz.git


মনে হয় না যে এই বিভক্তিতে ফাইল যুক্ত করা এবং সেগুলি পরে আপডেট করা সম্ভব, তাই না?
অ্যালেক্স

এটি আমার রেপোতে প্রচুর কমিট দিয়ে চালাতে ধীর বলে মনে হচ্ছে
শিন্তা স্মিথ

গিট বিভক্ত গিট - ইন্ডেক্স ফিল্টার ব্যবহার করে বলে মনে হচ্ছে যা --subdirectory- ফিল্টারের তুলনায় অত্যন্ত ধীর। কিছু রেপগুলির জন্য এটি এখনও একটি কার্যকর বিকল্প হতে পারে, তবে বড় রেপসের জন্য (একাধিক গিগা বাইটস, 6-অঙ্কের কমিট) - ইনডেক্স-ফিল্টার কার্যকরভাবে চালানোর জন্য কয়েক সপ্তাহ সময় নেয়, এমনকি ডেডিকেটেড ক্লাউড হার্ডওয়্যারগুলিতেও।
জোস্টেইন কেজনিগসেন

6
git clone git@example.com:thing.git
cd thing
git fetch
for originBranch in `git branch -r | grep -v master`; do
    branch=${originBranch:7:${#originBranch}}
    git checkout $branch
done
git checkout master

git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- dir1 dir2 .gitignore' --prune-empty -- --all

git remote set-url origin git@example.com:newthing.git
git push --all

অন্যান্য সমস্ত মন্তব্য পড়ার পরে আমাকে সঠিক ট্র্যাকে পেয়েছে। তবে আপনার সমাধানটি কেবল কাজ করে। এটি সমস্ত শাখা আমদানি করে এবং একাধিক ডিরেক্টরি সহ কাজ করে! গ্রেট!
jschober

1
forযেহেতু অন্যান্য অনুরূপ উত্তর এটা অন্তর্ভুক্ত করবেন না লুপ, স্বীকার মূল্য। আপনার ক্লোনটিতে প্রতিটি শাখার স্থানীয় অনুলিপি filter-branchনা থাকলে তার পুনর্লিখনের অংশ হিসাবে তাদের জন্য অ্যাকাউন্ট করবেন না, যা সম্ভবত অন্যান্য শাখায় প্রবর্তিত ফাইলগুলি বাদ দিতে পারে তবে এখনও আপনার বর্তমান শাখায় একত্রিত হয়নি। (যদিও এটি যে git fetchকোনও শাখায়
জেরেমি

5

একটি সহজ সমাধান: গিট-ফিল্টার-রেপো

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

বিদ্যমান সংগ্রহস্থলের ডিরেক্টরিগুলির সাবসেট থেকে নতুন সংগ্রহস্থল তৈরি করতে, আপনি কমান্ডটি ব্যবহার করতে পারেন:

git filter-repo --path <file_to_remove>

একাধিক ফাইল / ফোল্ডারগুলিকে শৃঙ্খলিত করে ফিল্টার করুন:

git filter-repo --path keepthisfile --path keepthisfolder/

সুতরাং, গিট-ফিল্টার-রেপো সহ মূল প্রশ্নের উত্তর দিতে আপনার কেবল নিম্নলিখিত কমান্ডের প্রয়োজন হবে:

git filter-repo --path apps/AAA/ --path libs/XXX/

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

3

হ্যাঁ। সেই সতর্কতাটিকে ওভাররাইড -fকরতে পরবর্তী কলগুলিতে পতাকা ব্যবহার করে ব্যাকআপ ওভাররাইট করা জোর করে filter-branch। :) অন্যথায় আমি মনে করি আপনার কাছে সমাধান রয়েছে (এটি এটির সাথে একবারে একটি অযাচিত ডিরেক্টরি মুছুন filter-branch)।


-4

বার্তাটির পরামর্শ অনুসারে রেফ / মূলটিতে .git ডিরেক্টরিতে থাকা ব্যাকআপটি মুছুন। ডিরেক্টরিটি লুকানো আছে।

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