পাঠকের উপকারের জন্য, এখানে এটি সংক্ষিপ্ত করার চেষ্টা করে এবং জিনিসগুলি প্রত্যাশা অনুযায়ী কাজ না করে কীভাবে এটি করা যায় তার জন্য একটি ধাপে ধাপে গাইড দেওয়ার চেষ্টা করে। অনুসরণ করা হয় পরীক্ষিত এবং নিরাপদ উপায় জন্য git
সংস্করণ 2.17
এবং উপরোক্ত একটি submodule পরিত্রাণ পেতে :
submodule="path/to/sub" # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
- এটি যদি আপনার পক্ষে কাজ করে না তবে নীচে দেখুন।
- কোনও বিকল্প নেই। বিপজ্জনক কিছু না। এবং আরও করা বিবেচনা করবেন না!
2.20.1
দেবিয়ান বুস্টার এবং উবুন্টু 18.04 এর সাথে পরীক্ষিত 2.17.1
।
"$submodule"
নামটি কোথায় রাখবেন তা বোঝানোর জন্য এবং আপনাকে স্পেস এবং এর মতো সতর্কতা অবলম্বন করতে হবে
- যদি উইন্ডোজ প্রথম লাইন উপেক্ষা করে এবং
"$submodule"
সাবমোডুলের সঠিকভাবে নির্দিষ্ট করা উইন্ডোজ উপায়ে প্রতিস্থাপন করে। (আমি উইন্ডোজ নই)
সতর্কবাণী!
.git
ডিরেক্টরিটির অভ্যন্তরটি নিজে নিজে স্পর্শ করবেন না ! ভিতরে সম্পাদনা .git
অন্ধকার দিকে প্রবেশ করে। সবদিক থেকে দূরে থাকুন!
এবং হ্যাঁ, আপনি এর git
জন্য দোষ দিতে পারেন , যেমন git
অতীতে অনেকগুলি সহজ জিনিস অনুপস্থিত ছিল । সাবমোডিয়ুলগুলি আবার মুছে ফেলার উপযুক্ত উপায়ের মতো।
আমি মনে করি ডকুমেন্টেশনের একটি খুব বিপজ্জনক অংশ রয়েছে git submodule
। এটি $GIT_DIR/modules/<name>/
নিজেকে অপসারণ করার পরামর্শ দেয় ।
আমার বোঝার মধ্যে এটি কেবল সাধারণ ভুল নয়, এটি অত্যন্ত বিপজ্জনক এবং ভবিষ্যতে বড় মাথাব্যথাকে উস্কে দেয়! নিচে দেখ.
মনে রাখবেন যে
git module deinit
এর প্রত্যক্ষ বিপরীত
git module init
কিন্তু
git submodule deinit -- module
git rm -- module
এছাড়াও বেশ বিপরীত
git submodule add -- URL module
git submodule update --init --recursive -- module
কারণ কিছু কমান্ডের মূলত কেবল একটি জিনিস ছাড়াও আরও কিছু করা প্রয়োজন:
git submodule deinit -- module
git rm
- (2) মডিউলটির ফাইলগুলি সরিয়ে দেয়
- (3) এরপরে পুনরাবৃত্তভাবে সাবমডিউলের সাবমোডিয়ুলগুলি সরিয়ে দেয়
- (4) আপডেট
.gitmodules
git submodule add
- তথ্য টানতে
.git/modules/NAME/
- (1) তাই
git submodule init
, আপডেট.git/config
- (২)
git submodule update
তাই করে, অদৃশ্যভাবে মডিউলটি পরীক্ষা করে
- (4) আপডেট
.gitmodules
git submodule update --init --recursive -- module
- প্রয়োজনে আরও ডেটা টানুন
- (3) সাবমডিউলের সাবমডিউলগুলি পুনরাবৃত্তভাবে পরীক্ষা করে
এটি সম্পূর্ণরূপে প্রতিসাম্য হতে পারে না, কেননা এটি কঠোরভাবে প্রতিসাম্য রাখা খুব বেশি অর্থবোধ করে না। কেবলমাত্র দুটিরও বেশি কমান্ডের প্রয়োজন নেই। এছাড়াও "ডেটাতে টানুন" অন্তর্নিহিত, কারণ আপনার এটি প্রয়োজন, তবে ক্যাশেড তথ্য মুছে ফেলা হয় না, কারণ এটি মোটেই প্রয়োজন হয় না এবং মূল্যবান ডেটা মুছতে পারে।
এটি সত্যই আগতদের কাছে আশ্চর্যজনক, তবে মূলত একটি ভাল জিনিস: git
কেবল স্পষ্টতই কাজটি করে এবং সে সঠিকভাবে করে এবং আরও কিছু করার চেষ্টা করে না। git
এটি একটি হাতিয়ার, যা অবশ্যই একটি নির্ভরযোগ্য কাজ করা উচিত, কেবল অন্য "ইয়ার্লেজেডে ওলমিলচসৌ" হওয়ার পরিবর্তে ("এয়ারগ্লেজে ওলমিলচসৌ" আমার জন্য "একটি সুইস সেনার ছুরির কিছু খারাপ সংস্করণ" অনুবাদ করে)।
সুতরাং আমি লোকদের অভিযোগ বুঝতে পেরেছি, "কেন git
আমার পক্ষে সুস্পষ্ট কাজটি করেন না"। এটি কারণ এখানে "সুস্পষ্ট" দৃষ্টিভঙ্গি থেকে নির্ভর করে। প্রতিটি পরিস্থিতিতে নির্ভরযোগ্যতা অনেক বেশি গুরুত্বপূর্ণ। তাই আপনার পক্ষে প্রায়শই স্পষ্ট হওয়া সমস্ত সম্ভাব্য প্রযুক্তিগত পরিস্থিতিতে সঠিক জিনিস নয়। দয়া করে মনে রাখবেন: এএএফআইসস git
সামাজিকভাবে নয়, প্রযুক্তিগত পথ অনুসরণ করে। (তাই চতুর নাম: গিট)
যদি এটি ব্যর্থ হয়
উপরোক্ত আদেশগুলি নিম্নলিখিত কারণে ব্যর্থ হতে পারে:
- আপনার
git
বয়স অনেক পুরনো। তারপরে আরও নতুন ব্যবহার করুন git
। (কীভাবে নীচে দেখুন)
- আপনার কাছে অননুমোদিত ডেটা রয়েছে এবং ডেটা হারাতে পারে। তারপরে প্রথমে তাদেরকে আরও ভালভাবে প্রতিশ্রুতিবদ্ধ করুন।
- আপনার submodule একটি
git clean
অর্থে পরিষ্কার নয়। তারপরে প্রথমে আপনার কমান্ডটি ব্যবহার করে সাবমডিউলটি পরিষ্কার করুন। (নিচে দেখ.)
- আপনি অতীতে এমন কিছু করেছেন যা দ্বারা অসমর্থিত
git
। তারপরে আপনি অন্ধকার দিকে রয়েছেন এবং জিনিসগুলি কুৎসিত এবং জটিল হয়ে ওঠে। (সম্ভবত অন্য কোনও মেশিন ব্যবহার করা এটি ঠিক করে দেয়))
- ব্যর্থ হওয়ার আরও অনেক উপায় আছে যা সম্পর্কে আমি অবগত নই (আমি কেবল কিছু
git
শক্তি-ব্যবহারকারী)
সম্ভাব্য সংশোধনগুলি অনুসরণ করে।
আরও নতুন ব্যবহার করুন git
যদি আপনার মেশিনে খুব বেশি পুরানো কিছু নেই submodule deinit
আপনার git
। আপনি যদি নিজের আপডেটটি (বা ক্যান) আপডেট না করতে চান git
, তবে কেবলমাত্র একটি নতুন সঙ্গে অন্য মেশিন ব্যবহার করুন git
! git
সম্পূর্ণরূপে বিতরণ করা বোঝানো হয়, যাতে আপনি git
কাজটি করতে অন্যটি ব্যবহার করতে পারেন :
workhorse:~/path/to/worktree$ git status --porcelain
কিছু আউটপুট অবশ্যই না ! যদি তা হয়, তবে প্রথমে জিনিসপত্র পরিষ্কার করুন!
workhorse:~/path/to/worktree$ ssh account@othermachine
othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
- এখন সাবমডিউল স্টাফ করুন
othermachine:~/TMPWORK$ git commit . -m . && exit
workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD
। এটি যদি কাজ না করে তবে ব্যবহার করুনgit reset --soft FETCH_HEAD
- এখন পরিষ্কার জিনিসগুলি, যতক্ষণ না
git status
আবার পরিষ্কার হয়। আপনি এটি করতে সক্ষম হবেন, কারণ প্রথম ধাপের জন্য আপনাকে এটি পরিষ্কার করে দেওয়া হয়েছিল।
এটি othermachine
কিছু ভিএম, বা উইন্ডোজ অধীনে কিছু উবুন্টু ডাব্লুএসএল হতে পারে, যাই হোক না কেন। এমনকি একটি chroot
(তবে আমি ধরে নিই যে আপনি নন-রুট, কারণ আপনি যদি হন তবে root
এটি আরও নতুনকে আপডেট করা সহজ হওয়া উচিত git
)।
মনে রাখবেন যে আপনি যদি না ssh
.ুকতে পারেন তবে git
সংগ্রহস্থল পরিবহনের জন্য ট্রেনলোড s আপনি আপনার ওয়ার্ক্রিটিকে কয়েকটি ইউএসবি স্টিকে ( .git
ডিরেক্টরি সহ ) অনুলিপি করতে পারেন এবং স্টিক থেকে ক্লোন করতে পারেন। আবার পরিষ্কার ফ্যাশনে জিনিসগুলি পেতে কপিটি ক্লোন করুন। এটি আপনার পিআইডিএ হতে পারে, যদি আপনার সাবমোডিয়ালগুলি অন্য মেশিন থেকে সরাসরি অ্যাক্সেসযোগ্য না হয়। তবে এর সমাধানও রয়েছে:
git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX
আপনি এই গুণটি ব্যবহার করতে পারেন এবং এটিতে সংরক্ষণ করা হয় $HOME/.gitconfig
। কিছুটা এইরকম
git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/
ইউআরএলগুলি পুনরায় লেখায়
https://github.com/XXX/YYY.git
মধ্যে
/mnt/usb/repo/XXX/YYY.git
আপনি যদি এর git
মতো শক্তিশালী বৈশিষ্ট্যে অভ্যস্ত হতে শুরু করেন তবে এটি সহজ ।
প্রথমে জিনিসপত্র পরিষ্কার করুন
ম্যানুয়ালি আপ পরিষ্কার করা ভাল, কারণ এইভাবে আপনি সম্ভবত কিছু ভুলে যাবেন detect
- যদি গিট সুরক্ষিত সামগ্রী সম্পর্কে অভিযোগ করে তবে এটিকে নিরাপদে কোথাও প্রতিশ্রুতিবদ্ধ করুন push
- যদি গিট কিছু বাকী অংশ সম্পর্কে অভিযোগ করে,
git status
এবং git clean -ixfd
আপনার বন্ধু
- অপশন থেকে বিরত করার চেষ্টা করুন
rm
এবং deinit
যতদিন আপনি পারেন হিসাবে। আপনি যদি প্রো হন তবে বিকল্পগুলি (যেমন -f
) git
ভাল। আপনি এখানে এসেছেন, আপনি সম্ভবত submodule
এলাকায় এত অভিজ্ঞ না । সুতরাং দুঃখিত চেয়ে নিরাপদ থাকুন।
উদাহরণ:
$ git status --porcelain
M two
$ git submodule deinit two
error: the following file has local modifications:
two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
NEW
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each
5: quit 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'
আপনি দেখুন, কোন -f
প্রয়োজন নেই submodule deinit
। জিনিসগুলি যদি এক git clean
অর্থে পরিষ্কার থাকে । এছাড়াও নোট করুন যে git clean -x
প্রয়োজন হয় না। এর অর্থ git submodule deinit
নিঃশর্তভাবে অচিহ্নযুক্ত ফাইলগুলি অপসারণ করা হয় যা উপেক্ষা করা হয়। এটি সাধারণত যা আপনি চান তা তবে এটির সম্পর্কে ভুলবেন না। কখনও কখনও উপেক্ষা করা ফাইলগুলি মূল্যবান হতে পারে যেমন ক্যাশেড ডেটা যা আবার গণনা করতে কয়েক ঘন্টা সময় লাগে।
কেন কখনও সরাবেন না $GIT_DIR/modules/<name>/
?
সম্ভবত লোকেরা ক্যাশেড সংগ্রহস্থল সরাতে চায়, কারণ তারা পরে কোনও সমস্যায় পড়তে ভয় পায়। এটি সত্য, তবে "সমস্যার" মধ্যে দৌড়ানোই এটি সমাধানের সঠিক উপায়! কারণ ফিক্সটি সহজ, এবং ঠিকঠাক হয়ে গেলে আপনি পরে সুখীভাবে বাঁচতে সক্ষম হবেন। আপনি নিজে ডেটা মুছে ফেলার চেয়ে এটি আরও জটিল সমস্যা এড়ায়।
উদাহরণ:
mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two
শেষ লাইনটি নিম্নলিখিত ত্রুটির আউটপুট দেয়:
A git directory for 'two' is found locally with remote(s):
origin https://github.com/hilbix/empty.git
If you want to reuse this local git directory instead of cloning again from
https://github.com/hilbix/src.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
কেন এই ত্রুটি? কারণ .git/modules/two/
পূর্বে থেকে জনবহুল ছিল https://github.com/hilbix/empty.git এবং এখন অন্য কিছু থেকে পুনরায় জনবহুল হইবে, যথা https://github.com/hilbix/src.git । আপনি যদি https://github.com/hilbix/empty.git থেকে এটি পুনরায় জনবসতি করেন তবে আপনি এটি দেখতে পাবেন না
এখন কি করতে হবে? ঠিক আছে, ঠিক যেমন বলা হয়েছে ঠিক তেমন করুন! ব্যবহার--name someunusedname
git submodule add --name someunusedname https://github.com/hilbix/src.git two
.gitmodules
তারপর দেখতে
[submodule "someunusedname"]
path = two
url = https://github.com/hilbix/src.git
ls -1p .git/modules/
দেয়
someunusedname/
two/
ভবিষ্যতে এইভাবে আপনি শাখাগুলি স্যুইচ করতে পারেন / সামনের দিকে এবং পিছিয়ে প্রতিশ্রুতিবদ্ধ করতে পারেন এবংtwo/
দুটি পৃথক (এবং সম্ভবত বেমানান) উজানের স্ট্রোপোজিটারির কারণে আর কোনও সমস্যায় পড়তে পারবেন না। এবং সেরাটি হ'ল: আপনি উভয়কে স্থানীয়ভাবে ক্যাশে রেখেছেন।
- এটি কেবল আপনার পক্ষে সত্য নয়। এটি আপনার সংগ্রহশালা ব্যবহার করে অন্য সকলের ক্ষেত্রেও সত্য।
- এবং আপনি ইতিহাস হারাবেন না। আপনি যদি পুরানো সাবমডিউলের অতি সাম্প্রতিক সংস্করণটি ধাক্কা দিতে ভুলে গেছেন তবে আপনি স্থানীয় অনুলিপিটি প্রবেশ করতে পারেন এবং পরে এটি করতে পারেন। মনে রাখবেন যে এটি বেশ সাধারণ যে কেউ কিছু সাবমডিউলগুলি ধাক্কা দিতে ভুলে যায় (কারণ এটি আগতদের জন্য এটি পিটা, যতক্ষণ না তারা অভ্যস্ত হয়ে যায়
git
)।
তবে আপনি যদি ক্যাশেড ডিরেক্টরিটি সরিয়ে ফেলেন তবে উভয় পৃথক চেকআউট একে অপরের উপর হোঁচট খাবে, কারণ আপনি --name
বিকল্পগুলি ব্যবহার করবেন না, তাই না ? সুতরাং প্রতিবার আপনি চেকআউট করার সময় আপনাকে সম্ভবত বার বার .git/modules/<module>/
ডিরেক্টরিটি সরিয়ে ফেলতে হবে । এটি অত্যন্ত জটিল এবং এরকম কিছু ব্যবহার করা শক্ত করে তোলে git bisect
।
সুতরাং এই মডিউল ডিরেক্টরিটিকে স্থানধারক হিসাবে রাখার একটি খুব প্রযুক্তিগত কারণ রয়েছে। নীচে কিছু অপসারণের জন্য প্রস্তাবিত ব্যক্তিরা আরও .git/modules/
ভাল জানেন না বা আপনাকে বলতে ভুলে যান যে এটি শক্তিশালী বৈশিষ্ট্যগুলি git bisect
ব্যবহার করা প্রায় অসম্ভবের মতো করে তোলে যদি এটি যদি এইরকম সাবমোডিয়াল অসঙ্গতি অতিক্রম করে।
উপরে আরও একটি কারণ দেখানো হয়েছে। তাকান ls
। আপনি সেখানে কি দেখতে পাচ্ছেন?
ঠিক আছে, মডিউলের ২ য় রূপটি two/
নীচে নয় .git/modules/two/
, এটি অধীনে রয়েছে .git/modules/someunusedname/
! সুতরাং মত জিনিস git rm $module; rm -f .git/module/$module
সম্পূর্ণ ভুল! আপনাকে অবশ্যই পরামর্শ module/.git
বা .gitmodules
সঠিক জিনিসটি সরাতে হবে!
সুতরাং কেবলমাত্র বেশিরভাগ উত্তরই এই বিপজ্জনক ফাঁদে পড়ে না, এমনকি খুব জনপ্রিয় git
এক্সটেনশনেও এই বাগটি ছিল ( এটি এখন সেখানে স্থির হয়েছে )! .git/
ডিরেক্টরিটির হাত যদি আপনি ঠিকঠাক না করেন, তবে আপনি কী করছেন তা আরও ভাল রাখুন!
এবং দার্শনিক দৃষ্টিভঙ্গি থেকে ইতিহাস মুছে ফেলা সর্বদা ভুল!
কোয়ান্টাম মেকানিক্স ব্যতীত যথারীতি, তবে এটি সম্পূর্ণ আলাদা something
FYI আপনি সম্ভবত এটি অনুমান করেছেন: হিলবিক্সটি আমার গিটহাব অ্যাকাউন্ট।
git rm modulename
এবংrm -rf .git/modules/modulename