আমি কীভাবে সাবমডিউলটি সরিয়ে ফেলব?


3539

আমি কীভাবে গিট সাবমডিউলটি সরিয়ে ফেলব?

যাইহোক, এমন কোনও কারণ আছে যা আমি কেবল করতে পারি না git submodule rm whatever?


109
সহজ উত্তর stackoverflow.com/a/21211232/94687 এখন সঠিক উত্তর , এবং এটি চিহ্নিত করা উচিত। এখন, এটি সহজ git rm modulenameএবংrm -rf .git/modules/modulename
imz - ইভান জ্যাকারিয়াশেভ

10
এটা আসলে সত্য নয়। এই উত্তরটি সাবমডুল এন্ট্রি থেকে মুছে ফেলা সম্বোধন করে না .git/config। গৃহীত উত্তরটি এএ সাবমডিউলটিকে পুরোপুরি অপসারণের আপ-টু ডেট উপায় দেখায়। : এটা এই উত্তর আরও succinctly ব্যাখ্যা হচ্ছে stackoverflow.com/a/36593218/1562138
fvgs

আমি এই নিবন্ধটি সাবমডিউলগুলি অপসারণে খুব সহায়ক বলে মনে করেছি। এটিতে .gitsubmodules এবং .git / কনফিগার ফাইল লিঙ্কের
Ri_

12
দয়া করে কিছু সময় নিজেকে বাঁচান এবং সরাসরি সেই উত্তরটি চলে যান (2017 এ): স্ট্যাকওভারফ্লো.com
ভিন্সনজো পাইই

আমি দুটি দিনের জন্য সাবমডিউল সমস্যা কুস্তি করেছি। ব্রেকথ্রুটি এলো যখন আমি এটি পেয়েছি: forums.developer.apple.com/thread/13102 । মূলত, এক্সকোড এবং সম্ভবত অন্যান্য অ্যাপ্লিকেশনগুলি ইউআরএলগুলিতে '~' প্রসারিত করার জন্য সংগ্রাম করে। একবার আমি ssh পরিবর্তন করেছি: //username@server.remoteHost.com/~/git/MyRepo.git এ ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (আসল পথটি দেখুন আপনার সার্ভারে), সমস্ত অদ্ভুততা দশ মিনিটের সাথে অদৃশ্য হয়ে যায়। আরও দেখুন stackoverflow.com/questions/32833100/...
এলিস ভ্যান Looij

উত্তর:


2212

যেহেতু git1.8.3 (এপ্রিল 22d, 2013) :

একবার "আপনি এই সাবমডিউলে আগ্রহী না" বলার কোনও পোরসিলাইনের উপায় ছিল না, একবার আপনি " submodule init" এর সাথে সাবমডিউলে আপনার আগ্রহ প্রকাশ করেন ।
" submodule deinit" এটি করার উপায়।

মুছে ফেলার প্রক্রিয়াটিও ব্যবহার করে git rm(git1.8.5 অক্টোবর 2013 থেকে)।

সারসংক্ষেপ

3-পদক্ষেপ অপসারণ প্রক্রিয়াটি তখন হবে:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

ব্যাখ্যা

rm -rfএই উল্লেখ করা হয় ড্যানিয়েল শ্রোডার এর উত্তর , এবং সংক্ষিপ্ত দ্বারা Eonil মধ্যে মন্তব্য :

এটি .git/modules/<path-to-submodule>/অপরিবর্তিত রয়েছে।
সুতরাং আপনি যদি একবার এই পদ্ধতির সাহায্যে কোনও সাবমডিউল মুছে ফেলেন এবং সেগুলি পুনরায় যুক্ত করেন তবে এটি সম্ভব হবে না কারণ ইতিমধ্যে ভান্ডারগুলিকে দূষিত করা হয়েছে।


git rm: প্রতিশ্রুতি দেখুন 95c16418 :

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

যাক " git rm" Help কেবল কাজই গাছ থেকে submodule সরানোর না করে বরং সরিয়ে ব্যবহারকারী " submodule.<submodule name>" থেকে অধ্যায় .gitmodulesফাইল ও মঞ্চ উভয়।


git submodule deinit: এটি এই প্যাচ থেকে উদ্ভূত :

" git submodule init" দিয়ে ব্যবহারকারী গিটকে বলতে সক্ষম হয়েছেন যে তারা এক বা একাধিক সাবমডিউল সম্পর্কে যত্নশীল এবং এটি পরবর্তী কলটিতে " git submodule update" জনবহুল করতে চায় ।
তবে বর্তমানে কোনও সহজ উপায় নেই যা তারা গিটকে বলতে পারে যে তারা আর কোনও সাবমডিউলটির বিষয়ে চিন্তা করে না এবং স্থানীয় কাজের গাছ থেকে মুক্তি পেতে চায় (যদি না ব্যবহারকারী সাবমডিউল ইন্টার্নাল সম্পর্কে অনেক কিছু জানেন এবং " submodule.$name.url" সেটিংটি .git/configকাজের সাথে একসাথে থেকে মুছে না ফেলে) গাছ নিজেই)।

একটি ' deinit' কমান্ড সরবরাহ করে সেই ব্যবহারকারীদের সহায়তা করুন ।
এটি প্রদত্ত সাবমডিউল (গুলি) (অথবা ' ' দেওয়া থাকলে আরম্ভ করা হয়েছে এমন সকলের জন্য ) থেকে পুরো submodule.<name>বিভাগটি সরিয়ে দেয়.git/config.
বাধ্য হয়ে না থাকলে বর্তমান কাজের গাছটিতে পরিবর্তন রয়েছে তবে ব্যর্থ।
কমান্ড লাইনে প্রদত্ত সাব-মডিউলটির জন্য ইউআরএল সেটিংটি খুঁজে পাওয়া যায় না .git/config, তবে তবুও ব্যর্থ হবেন না বলে অভিযোগ করুন।

(ডি) প্রারম্ভিক পদক্ষেপগুলি ( .git/configএবং .git/modules/xxx) পদক্ষেপ নিলে এটি যত্ন নেয়

Git1.8.5 সাল থেকে, git rmলাগে এছাড়াও এর পরোয়া:

  • ' add' পদক্ষেপ যা .gitmodulesফাইলটিতে একটি উপ-মডেলের url রেকর্ড করে : এটি আপনার জন্য অপসারণ করা দরকার।
  • সাবমোডিয়াল বিশেষ এন্ট্রি ( এই প্রশ্নের দ্বারা বর্ণিত হিসাবে ): গিট আরএম এটি সূচক থেকে সরিয়ে দেয়:
    git rm --cached path_to_submodule(কোনও পিছনে স্ল্যাশ নেই)
    যা সূচীতে সঞ্চিত ডিরেক্টরিটি একটি বিশেষ মোড "160000" দিয়ে সরিয়ে ফেলবে, এটিকে সাবমোডিয়ুল রুট ডিরেক্টরি হিসাবে চিহ্নিত করবে will ।

যদি আপনি এই শেষ পদক্ষেপটি ভুলে যান এবং নিয়মিত ডিরেক্টরি হিসাবে সাবমডিউলটি কী যুক্ত করার চেষ্টা করেন তবে আপনি ত্রুটির বার্তা পাবেন:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

দ্রষ্টব্য: গিট 2.17 (Q2 2018) থেকে, গিট সাবমডিউল ডিনিট এখন আর শেল স্ক্রিপ্ট নয়।
এটি একটি সি ফাংশনে কল।

দেখুন কমিট 2e61273 , কমিট 1342476 দ্বারা (14 জানুয়ারী 2018) Prathamesh চৌহান ( pratham-pc)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে ead8dbe কমিট , 13 ফেব্রুয়ারী 2018)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

18
আপনি কি ব্যবহারের উদাহরণ দিতে পারেন submodule deinit?
জাকদানস

5
: @yourfriendzak এখানে কেউ একটি উদাহরণ সফলভাবে ব্যবহার করছে stackoverflow.com/a/16161950/6309 । তবে মনে রাখবেন যে, আমি যা বিশ্বাস করেছি তার বিপরীতে, ১.৮.৩ এখনও প্রকাশ হয়নি! ইউনিক্সে, আপনি এটি উত্স থেকে সংকলন করতে পারেন।
ভনসি

2
@ হামিশডাউনারের বিশেষ এন্ট্রিটি চলে যেতে হবে (ডিরেক্টরিটি আর কোনও সাবমডিউল নয়), এবং এটি .gitmodulesঠিক হওয়া উচিত, তবে আমি এখনও .gitডিরেক্টরিটি (যেমন স্থানীয় কনফিগারেশন, আপনার স্থানীয় রেপোতে) এর সাথে ডাবল-চেক করব : এটি নয় ক git pull) দ্বারা সংশোধিত )
ভনসি

2
@ জায়েেন হ্যাঁ, আপনি যদি সূচকে .gitmodulesপ্রবেশ এবং মুছে ফেলা বিশেষ সারণি অপসারণের প্রতিশ্রুতি দেন এবং এই রেপোটিকে চাপ দেন, অন্যরা এটি টানতে পারে এবং সেই সাবমডিউলটি চলে যাবে।
ভোনসি

3
বর্তমান গিট (v1.9 +) এ, সাধারণ git rm submoduleলোকেরা ইতিমধ্যে যা বলেছে ঠিক তেমনভাবে আপনার যা চান তা করে।
পিট পিটারসন

3445

পৃষ্ঠার মাধ্যমে গিট সাবমডিউল টিউটোরিয়াল :

সাবমডিউলটি অপসারণ করতে আপনার প্রয়োজন:

  1. .gitmodulesফাইল থেকে প্রাসঙ্গিক বিভাগ মুছুন ।
  2. .gitmodulesপরিবর্তনগুলি পর্যায়ক্রমে :
    git add .gitmodules
  3. থেকে প্রাসঙ্গিক বিভাগটি মুছুন .git/config
  4. কার্যকারী গাছ এবং সূচক থেকে সাবমডিউল ফাইলগুলি সরান:
    git rm --cached path_to_submodule(কোনও পিছনে স্ল্যাশ নেই)।
  5. সাবমডিউলের .gitডিরেক্টরিটি সরান :
    rm -rf .git/modules/path_to_submodule
  6. পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ:
    git commit -m "Removed submodule <name>"
  7. এখনই ট্রেড করা সাবমডিউল ফাইলগুলি মুছুন:
    rm -rf path_to_submodule

এছাড়াও দেখুন : নীচের বিকল্প পদক্ষেপ


410
"এবং যাইহোক, এমন কোনও কারণ আছে যা আমি কেবল উপ-মডেল আরএমকে কিছুতেই বলতে পারি না?" ?
abernier

48
@ অ্যাবার্নিয়ার একটি কার্টের উত্তর হতে পারে "কারণ এরকম কোনও আদেশ নেই" " আমার ধারণা হ'ল তারা দুর্ঘটনাজনিত ডেটা ক্ষতি থেকে বাঁচতে সাবমডিউল ফাইল বনাম সাবমডিউল কনফিগারেশনকে সুস্পষ্ট করার চেষ্টা করছেন। সম্ভবত একজন ব্যক্তি ভাববেন যে git submodule rmকেবল সাব মডুল রেজিস্ট্রেশন সরিয়ে ফেলবে, এবং যদি কমান্ডটি স্থানীয় সংগ্রহস্থলটি মুছে ফেলে তবে অবাক হয়ে যাবে। যে কোনও স্থানীয় পরিবর্তন অপ্রত্যাশিতভাবে হারিয়ে যাবে। এবং সম্ভবত অন্য কোনও ব্যক্তি ভাববেন যে কেবল ফাইলগুলি সরানো হবে।
জন দৌহাত

119
সত্যি বলতে কী, আমি জানি না। আমি আশা করি তারা একটি কমান্ড যুক্ত করেছে, যদিও। এই 4 টি পদক্ষেপ খুব জটিল।
জন দৌহাত

25
); এখানে একটি ব্যাশ স্ক্রিপ্ট করে একটি submodule সরিয়ে ফেলা হবে, শুধু submodule-RM জন্য একটি Git ওরফে তৈরি gist.github.com/2491147
Capi Etheriel

33
এছাড়াও rm -rf .git \ মডিউলগুলি \ সাবমডিউল নাম প্রয়োজন?
রজারডপ্যাক

484

শুধু একটি নোট. গিট ১.৮.৫.২ থেকে যেহেতু দুটি কমান্ড করবে:

git rm the_submodule
rm -rf .git/modules/the_submodule

@ মার্ক শেভের্টনের উত্তরটি সঠিকভাবে উল্লেখ করেছে যে, দ্বিতীয় লাইনটি যদি ব্যবহার না করা হয় তবে আপনি আপাতত সাবমডিউলটি সরিয়ে ফেললেও, অবশিষ্টাংশ .git / মডিউল / the_submodule ফোল্ডার একই সাবমোডিয়ুলটিকে ভবিষ্যতে যুক্ত বা প্রতিস্থাপন করা থেকে বিরত রাখবে । এছাড়াও, @ ভনসি যেমন উল্লেখ করেছে, একটি সাবমডিউলে git rmবেশিরভাগ কাজ করবে।

- আপডেট (07/05/2017) -

কেবল স্পষ্ট the_submoduleকরে বলতে গেলে, প্রকল্পের অভ্যন্তরের সাবমোডিয়ুলের আপেক্ষিক পথ। উদাহরণস্বরূপ, এটি subdir/my_submoduleযদি সাব-মডিউলটি একটি উপ-ডিরেক্টরিতে থাকে subdir

মতামত এবং অন্যান্য উত্তরে সঠিকভাবে নির্দেশিত হিসাবে , দুটি কমান্ড (যদিও একটি সাবমডিউল অপসারণের জন্য কার্যত যথেষ্ট), তৃতীয় কমান্ড ব্যবহার করে অপসারণ করা যেতে পারে (জুলাই 2017 হিসাবে) [submodule "the_submodule"]বিভাগে একটি ট্রেস রেখে যায় .git/config:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

5
আমি গিট সংস্করণে ২.৪.৯ (অ্যাপল গিট -60) এ আছি এবং আমাকে যা করতে হয়েছিল তা হল rm the_submodule। আমি ঠেলাঠেলি করে তারপরে সাবমডিউল হিসাবে একই নামে একটি ফোল্ডার পুনরায় যুক্ত করেছি এবং এটি ইস্যু ছাড়াই কাজ করে।
ডেভিড সিলভা স্মিথ 21

19
এটি সাবমডুল এন্ট্রি থেকে সরিয়ে দেয় না .git/configসাবমডিউলটি সরানোর সম্পূর্ণ উপায়ের জন্য stackoverflow.com/a/36593218/1562138 দেখুন ।
fvgs

2
@ ড্রেভিকো আমি গিট ২.১১.১-এর সাথে এটি পরীক্ষা করেছি এবং আমি আগের মতো আচরণটি পর্যবেক্ষণ করছি। এন্ট্রি এবং ডিরেক্টরি এবং এর বিষয়বস্তু git init && git submodule add <repository> && git rm <name>পিছনে । সাবমডিউলটি সরিয়ে দেওয়ার আগে আপনি সম্ভবত আরম্ভ করেননি? .git/config.git/modules/<name>
fvgs

2
আমি এই প্রথম চালানো নিরাপদ বোধ করি .. git submodule deinit -f the_submodule
danday74

1
@ জারোদ স্মিথ হ্যাঁ, এটিই পথ। আপডেট দেখুন।
tinlyx

478

এই প্রশ্নের বেশিরভাগ উত্তর পুরানো, অসম্পূর্ণ বা অহেতুক জটিল।

গিট ১.7.৮ বা আরও নতুন ব্যবহার করে ক্লোন করা একটি সাবমডিউল আপনার স্থানীয় রেপোতে নিজের বেশিরভাগ চারটি চিহ্ন খুঁজে বের করবে। এই চারটি ট্রেস অপসারণের প্রক্রিয়াটি নীচের তিনটি আদেশের দ্বারা দেওয়া হয়েছে:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

39
কেন এই উত্তরটির এত কম সংখ্যক ব্যয় হয়েছে? এই সমস্ত জনপ্রিয় উত্তরগুলি কিছু মিস করে, এটি কেবলমাত্র সহজতম উপায়ে একটি সাবমডিউলের সমস্ত চিহ্ন চিহ্নিত করে really এবং দ্রষ্টব্য: আদেশের ক্রমটি গুরুত্বপূর্ণ।
mbdevpl

2
আমার নিজের প্রশ্নের জবাব দিতে: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
টমাস

5
@mbdevpl গৃহীত উত্তরের ৩ বছর পরে এসেছিল এবং আমি অনুমান করি যে কেউ ওপিকে এই উত্তরটি গ্রহণ করতে রাজি করতে পারেনি
অ্যান্ডি

10
এই 2018 এর জটিল উত্তর নয়?
ওয়ারেন পি

9
.gitmodules ফাইল এখনও এই কমান্ডগুলি প্রয়োগ অপ্রভাবিত বলে মনে হয়
Fractalf

206

সহজ পদক্ষেপ

  1. কনফিগার এন্ট্রি সরান:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. সূচী থেকে ডিরেক্টরি সরান:
    git rm --cached $submodulepath
  3. সমর্পণ করা
  4. অব্যবহৃত ফাইলগুলি মুছুন:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

দয়া করে নোট করুন: $submodulepath লিডিং বা ট্রেলিং স্ল্যাশ নেই contain

পটভূমি

আপনি যখন করেন git submodule add, এটি কেবল এতে যুক্ত হয় .gitmodules, তবে একবার এটি করার পরে git submodule initএটি যুক্ত হয়ে যায় .git/config

সুতরাং আপনি যদি মডিউলগুলি সরাতে চান তবে দ্রুত পুনরুদ্ধার করতে সক্ষম হন তবে কেবল এটি করুন:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

git rebase HEADপ্রথমে এবং git commit শেষে এটি করা ভাল ধারণা , যদি আপনি এটি কোনও স্ক্রিপ্টে রাখেন।

এছাড়াও আমি কি একটি গিট সাবমডিউলকে জনশক্তি করতে পারি? এর উত্তরে একবার দেখুন ?


1
আমার কাছে প্রচুর সাবমডিউল ছিল (এবং আরও বড় গণ্ডগোল) তাই আমাকে এগুলি লুপের মধ্য দিয়ে যেতে হয়েছিল। যেহেতু তাদের বেশিরভাগই যেখানে একটি নির্দিষ্ট ডিরেক্টরি এবং এলএস আউটপুট অন্তর্ভুক্ত রয়েছে ট্রেলিং স্ল্যাশ। আমি এরকম কিছু করেছি for dir in directory/*; do git rm --cached $dir; done
পাবলো ওলমোস ডি আগুইলেরা সি।

এই তালিকাটি যা পুনরাবৃত্তি মোছার জন্য স্ক্রিপ্টে ব্যবহার করা যেতে পারে git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'- - দেখে মনে হচ্ছে কিছু git submodule | grep -v '^+' | cut -d' ' -f3
গণ্ডগোল

2
কোনও স্থানীয় পরিবর্তন করা হয়নি এমন মডিউলগুলির তালিকা পেতে -git submodule | grep '^+' | cut -d' ' -f2
এররডেওলফার

দ্রষ্টব্য, আমাকে submodulenameডাবল উদ্ধৃতিতে অন্তর্ভুক্ত করতে হয়েছিল "submodulename".. .git/configফাইলটি উল্লেখ করে
Muon

সহজ। দক্ষ. ২.২২.০-এ, পদক্ষেপ 1 এর পরে, আপনাকে দ্বিতীয় পর্যায়ে যাওয়ার আগে। গিটমডিউলগুলি পরিবর্তন করতে হবে
মিশেল

83

সুপারিশগুলি ছাড়াও, আমাকে rm -Rf .git/modules/path/to/submoduleএকই নামের সাথে একটি নতুন সাবমডিউল যুক্ত করতে সক্ষম হতে হয়েছিল (আমার ক্ষেত্রে আমি কাঁটাটির সাথে আসলটি প্রতিস্থাপন করছিলাম)


1
এটির সাথে আমারও সমস্যা ছিল। আপনি যদি একই উপায়ে সাবমডিউলটি পুনরায় ইনস্টল করার চেষ্টা করেন, তবে এটি যে ব্রাঞ্চের জিনিসগুলিকে ভুল করে দেয় তাতে ব্রাঞ্চের তথ্যটি সেই জায়গায় ক্যাশে রাখে।
jangosteve

ধন্যবাদ, আমারও এটি দরকার ছিল @ অ্যান্টন, আমি সম্মত, এবং এই তথ্য যুক্ত করতে আমি উত্তরের উত্তর সম্পাদনা করেছি।
উইলিয়াম ডেনিস

আমি প্রতিস্থাপনের কাজটি করার জন্য
নাম

60

ব্যবহার করে যুক্ত একটি সাবমডিউল অপসারণ করতে:

git submodule add blah@blah.com:repos/blah.git lib/blah

চালান:

git rm lib/blah

এটাই.

গিট (পুরানো (1.8.5) এর পুরানো সংস্করণগুলির জন্য:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

1
+1 আসলে। গিট ১.৮.৩ এর পরে এটিই একমাত্র সঠিক উত্তর। সঠিক হিসাবে গ্রহণ করা উচিত।
Xananax

6
git rmএখনও স্টাফ ভিতরে রাখে .git/modules/। (
2.5.4

1
@ রুডলফএডমকোভিচ এটি আমার পক্ষে কাজ করে? লক্ষ্য করুন যে এটি যদি সঠিক পথে মেলে তবে সাব-মডুল এন্ট্রি সরিয়ে ফেলবে; আপনি যদি একটি উপ-মডুল সরিয়ে নিয়েছেন এবং তারপরে git rmএটি ব্যবহার করেন না; আমার ম্যাকের ২.৪.৪ সহ একটি দ্রুত পরীক্ষা এখানে ডকুমেন্টেশনে বর্ণিত অনুযায়ী .gitmodules ফাইল আপডেট করে: git-scm.com/docs/git-rm#_submodules ... তবে আপনি যদি প্ল্যাটফর্মের একধরণের সংমিশ্রণটি খুঁজে পেয়েছেন তবে / সংস্করণ যেখানে এটি ঘটে না, আপনার সম্ভবত এটি সম্পর্কে একটি বাগ জমা দেওয়া উচিত।
ডগ

2
এই উত্তর সম্পূর্ণ সঠিক নয়। dir এবং ফাইল git rmস্টাফ ছেড়ে (ওবুন্টু, গিট 2.7.4)। : অন্য উত্তর 100% কাজ করে stackoverflow.com/a/36593218/4973698.git/modules/.git/config
mbdevpl

50

আপনাকে অবশ্যই প্রবেশদ্বারটি সরিয়ে ফেলতে হবে .gitmodulesএবং .git/configইতিহাস থেকে মডিউলটির ডিরেক্টরিটি সরিয়ে ফেলতে হবে:

git rm --cached path/to/submodule

যদি আপনি গিটের মেলিং তালিকায় লিখেন তবে সম্ভবত কেউ আপনার জন্য শেল স্ক্রিপ্ট করবে do


: কোন শেল স্ক্রিপ্টের জন্য কোন প্রয়োজন নেই, অন্যান্য উত্তর submodule সব ট্রেস সরানোর জন্য কমান্ড রয়েছে stackoverflow.com/a/36593218/4973698
mbdevpl

42

আপনি অন্যের দ্বারা সরবরাহিত সমাধানগুলি স্বয়ংক্রিয় করতে একটি উপনাম ব্যবহার করতে পারেন:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

এটি আপনার গিট কনফিগারেশনে রাখুন এবং তারপরে আপনি এটি করতে পারেন: git rms path/to/submodule


-1 এটি সাধারণ হিসাবে খুব ভুল। প্রথম: এটি ধরে নিয়েছে যে সাবমডিউলের নাম এবং পথ অভিন্ন যা বেশিরভাগ ক্ষেত্রে হয় না । আইই git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two। দ্বিতীয়: আপনাকে অবশ্যই এটি সঠিক পথ থেকে চালানো উচিত। gitএলিয়াসগুলি ওয়ার্কট্রিতে যে কোনও জায়গায় কাজ করা উচিত (বা নিখুঁতভাবে ব্যর্থ হওয়া)। তৃতীয়: git config -f .git/configসাবমডিউলগুলির মধ্যে ব্যর্থ হয়, .gitসাধারণত সেখানে একটি ফাইল থাকে।
টিনো

42

সংক্ষিপ্তসার হিসাবে, এটি আপনার করা উচিত:

  1. path_to_submoduleভেরিট সেট করুন (কোনও পিছনে স্ল্যাশ নেই):

    path_to_submodule=path/to/submodule

  2. .Gitmodules ফাইল থেকে প্রাসঙ্গিক লাইন মুছুন:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. .Git / কনফিগার থেকে প্রাসঙ্গিক বিভাগটি মুছুন

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. আনস্টেজ করুন এবং কেবল সূচী থেকে $ path_to_submodule সরান (তথ্য হারানো রোধ করতে)

    git rm --cached $path_to_submodule

  5. .Gitmodules এ পরিবর্তনগুলি ট্র্যাক করুন

    git add .gitmodules

  6. সুপারপ্রজেক্ট প্রতিশ্রুতিবদ্ধ

    git commit -m "Remove submodule submodule_name"

  7. এখনই ট্রেড করা সাবমডিউল ফাইলগুলি মুছুন

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


সুতরাং যে কেউ আমার পরিবর্তনটিকে টানছেন তাদের প্রত্যেককে সাব-মডুল ক্যাশে অপসারণের জন্য rm -rf $ path_to_submodule rm -rf .git / মডিউল / $ পাথ_ টো_সুবডুল চালাতে হবে?
j2emanue

আমি আপডেট করার পরামর্শ দিই git submodule update,। এবং যদি সাবমডিউলগুলির পাথগুলি সঠিকভাবে আপডেট না করা হয় (গিট একটি ত্রুটি নিক্ষেপ করে), সেগুলি সরিয়ে ফেলুন:rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
লুইস্কুল করুন

40

যদি সাবমোডুলটি দুর্ঘটনাক্রমে যুক্ত হয়ে যায় কারণ আপনি এমন একটি ফোল্ডার যোগ করেছেন, প্রতিশ্রুতিবদ্ধ এবং পুশ করেছেন যা ইতিমধ্যে একটি গিট রিপোজিটরি (রয়েছে .git), আপনার .gitmodulesসম্পাদনা করার জন্য কোনও ফাইল বা কিছু থাকবে না .git/configএই ক্ষেত্রে আপনার যা প্রয়োজন তা হ'ল:

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

এফডাব্লুআইডাব্লু , আমি .gitফোল্ডারটি করার আগেও সরিয়ে ফেলি git add


ঠিক আমার ক্ষেত্রে
zhekaus

37

আমি deinitআমার জন্য ভাল কাজ খুঁজে পেয়েছি :

git submodule deinit <submodule-name>    
git rm <submodule-name>

গিট ডক্স থেকে :

deinit

প্রদত্ত submodule.$name সাবমোডিয়ুলগুলি নিবন্ধভুক্ত করুন , অর্থাৎ তাদের কাজের গাছের সাথে .git / কনফিগারেশন থেকে পুরো বিভাগটি সরিয়ে ফেলুন ।


সম্মত হন একই সমাধান। এটি আজ 2018 সালের সেরা উপায়)
woto

1
এটি .git / মডিউল / .. সরান নি। আপনার এগুলি অপসারণ করা উচিত, @fvgs- এর উত্তরটি দেখুন
কুর্জ

কেন এই সহজ এবং সহজ সমাধানটি 1 নম্বর নয় তা
জানুন

AFAICS এই মনে করা হয় নতুন সবচেয়ে নিরাপদ উত্তর gitগুলি যা জানি deinitহিসাবে, অন্যান্য উত্তর সরিয়ে ফেলা হবে .git/modules/submoduleযা নতুন করা বলে মনে হয় খুব তাড়াতাড়ি ডিরেক্টরি, gitগুলি এখন বা তখন ব্যর্থ। এছাড়াও (আমার মন্তব্যটি দেখুন) অপসারণটি .git/modules/submoduleভুল পথ হতে পারে, সুতরাং এটি একটি বিপজ্জনক পদক্ষেপ, পরে gitঅভিযোগ করা হলে সবচেয়ে ভাল নেওয়া হয় (বা আপনি যদি 299% নিশ্চিত হন তবে আপনি যা চান এটি সঠিক পথ এবং সত্যই প্রয়োজন)।
টিনো

আমিও প্রয়োজন git commitDir কাজ মঞ্চস্থ পরিবর্তন কমিট করতে modified .gitmodulesএবং deleted <submodule-path>
ইউরি পোজনিয়াক

20

এই সাইটে সমস্ত ভিন্ন উত্তর নিয়ে পরীক্ষা করার পরে, আমি এই সমাধানটি দিয়ে শেষ করেছি:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

আপনি সাবমডিউলটি যুক্ত করার আগে এটি ঠিক একই অবস্থা পুনরুদ্ধার করে। আপনি এখনই সাবডমডিউলটি আবার যুক্ত করতে পারেন, যা বেশিরভাগ উত্তর দিয়ে এখানে সম্ভব ছিল না।

git submodule add $giturl test
aboveScript test

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

এটি দিয়ে পরীক্ষা করা হয়েছিল:

$ git --version
git version 1.9.3 (Apple Git-50)

git rm --cached $pathতার rm -rf $pathপরিবর্তে আপনি কেন ব্যবহার করবেন git rm -r $path?
bfontaine

-1 আপনি কোনও সাবমডিউলের মধ্যে একটি সাবমডিউল সরানোর চেষ্টা করলে কাজ হয় না (সাবমডিউল গাছ তৈরি করতে পারে!)। এছাড়াও এই বিপজ্জনক বগী কারণে উদ্ধৃত অনুপস্থিত করুন! উদাহরণ git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'-> আপনি যখন আপনার স্ক্রিপ্টের সাহায্যে 'বিপজ্জনক .. সাবমডিউল' অপসারণ করার চেষ্টা করবেন তখন rm -rf ..এটি যা সম্ভবত আপনি চান তা নয় ...
টিনো

17

আমি বর্তমানে ডিসেম্বরে 2012 যা করছি (এই উত্তরগুলির বেশিরভাগটি একত্রিত করে):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"

15

আমি যা করেছি তা এখানে:

1.) .gitmodules ফাইল থেকে প্রাসঙ্গিক বিভাগটি মুছুন। আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:

git config -f .gitmodules --remove-section "submodule.submodule_name"

২) .gitmodulesপরিবর্তনগুলি পর্যায়ক্রমে করুন

git add .gitmodules

৩) প্রাসঙ্গিক বিভাগটি থেকে মুছুন .git/config। আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:

git submodule deinit -f "submodule_name"

৪) গিটলিংক সরান (কোনও পিছনে স্ল্যাশ নেই):

git rm --cached path_to_submodule

৫) ক্লিনআপ করুন .git/modules:

rm -rf .git/modules/path_to_submodule

6.) প্রতিশ্রুতিবদ্ধ:

git commit -m "Removed submodule <name>"

)) এখন অবিরত থাকা সাবমডিউল ফাইলগুলি মুছুন

rm -rf path_to_submodule

এর জন্য ধন্যবাদ. আমার জন্য, আমাকে প্রথম তিনটি পদক্ষেপের অর্ডার 3), 1), 2) এ পুনরায় সাজানো হয়েছিল। 1) প্রথম fatal: no submodule mapping found in .gitmodules for path 'submodule_name'পদক্ষেপ 3 এ প্রথম দেওয়া উভয় পদক্ষেপ যদিও প্রয়োজন ছিল। (গিট ভি 2.8.2)
U007D

13

আমি সম্প্রতি একটি গিট প্রকল্প খুঁজে পেয়েছি যাতে গিট সম্পর্কিত অনেকগুলি কমান্ড অন্তর্ভুক্ত রয়েছে: https://github.com/visionmedia/git-extras

এটি ইনস্টল করুন এবং টাইপ করুন:

git-delete-submodule submodule

তারপরে জিনিসগুলি সম্পন্ন হয়। সাবমডিউল ডিরেক্টরিটি আপনার রেপো থেকে সরানো হবে এবং এখনও আপনার ফাইল সিস্টেমে বিদ্যমান থাকবে। তারপর আপনি পরিবর্তন কমিট করতে পারেন: git commit -am "Remove the submodule"


আপনার হয়ে এই কল করতে পারেন git delete-submodule, যেমন git-extrasচাহিদা কাজে পাথ যাবে। এছাড়াও নোট করুন যে আমি ব্যবহার না করার পরামর্শ দিচ্ছিgit-extras , কারণ এর বেশিরভাগ অংশই অত্যন্ত বগি এবং বিপজ্জনক । আইই git-delete-submoduleসম্ভবত নীচের ভুল পথটি সরিয়ে ফেলবে .git/modules/*, কারণ এটি ধরে নিয়েছে যে মডিউল এবং পথটি অভিন্ন (যা প্রায়শই ক্ষেত্রে হয় না), এবং আপনি যদি কোনও সাবমডিউলের মধ্যে একটি সাবমোডুল সরানোর চেষ্টা করেন তবে এটি সঠিকভাবে কাজ করে না। git-extrasহতে পারে 99% সহায়ক, তবে দয়া করে যদি জিনিসগুলি সম্পূর্ণরূপে এটির ভুল ব্যবহার করে তবে অভিযোগ করবেন না। তোমাকে সতর্ক করা হল!
টিনো

10

আমাকে জন ডাউটহাতের পদক্ষেপগুলি আরও একধাপ এগিয়ে এবং cdসাবমডিউলের ডিরেক্টরিতে নিয়ে যেতে হয়েছিল এবং তারপরে গিট সংগ্রহস্থলটি সরিয়ে ফেলতে হয়েছিল:

cd submodule
rm -fr .git

তারপরে আমি সাব-মডিউলটির পুরানো রেফারেন্স ছাড়াই পিতামাতার গিট সংগ্রহস্থলের অংশ হিসাবে ফাইলগুলি প্রতিশ্রুতিবদ্ধ করতে পারি।


git rm --cacheপদক্ষেপটি করার চেষ্টা করার সময় ত্রুটিটি "মারাত্মক: গিট রিপোজিটরি নয়:" ত্রুটি পেরিয়ে যাওয়ার জন্য আমাকেও এটি করতে হয়েছিল ।
রিকডিটি

9

এখানে প্রয়োজনীয় 4 টি পদক্ষেপ যা আমি প্রয়োজনীয় বা দরকারী পেয়েছি (গুরুত্বপূর্ণগুলি প্রথমে):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

তত্ত্ব , git rmধাপ 1 এটি যত্ন নিতে হবে। আশা করা যায়, ওপি প্রশ্নের দ্বিতীয় অংশটির একদিন ইতিবাচক উত্তর দেওয়া যেতে পারে (এটি একটি কমান্ডে করা যেতে পারে)।

তবে জুলাই 2017 পর্যন্ত, পদক্ষেপ 2টি ডেটা মুছে ফেলার .git/modules/জন্য প্রয়োজনীয় অন্যথায়, আপনি উদাহরণস্বরূপ ভবিষ্যতে সাবমডিয়ুলটি যুক্ত করতে পারবেন না।

সমস্ত কমান্ড কাজ করে বলে মনে হচ্ছে , টিনলিক্সের উত্তর হিসাবে উল্লেখ করা হয়েছে আপনি সম্ভবত গিট 1.8.5+ এর জন্য উপরের দুটি পদক্ষেপ নিয়ে পালিয়ে যেতে পারেন git submodule

পদক্ষেপ 3 the_submoduleফাইলের বিভাগটি সরিয়ে দেয় .git/config। এটি সম্পূর্ণতার জন্য করা উচিত। (এন্ট্রি পুরানো গিট সংস্করণগুলির জন্য সমস্যা তৈরি করতে পারে, তবে আমার পরীক্ষা করার মতো একটিও নেই)।

এর জন্য, বেশিরভাগ উত্তর ব্যবহারের পরামর্শ দেয় git submodule deinit। আমি এটি ব্যবহার করতে আরও স্পষ্ট এবং কম বিভ্রান্ত মনে করি git config -f .git/config --remove-section। মতে Git-submodule ডকুমেন্টেশন , git deinit:

প্রদত্ত সাবমোডিয়ুলগুলি নিবন্ধভুক্ত করুন ... আপনি যদি সত্যিই ভাণ্ডার থেকে একটি সাবমডিউল সরিয়ে ফেলতে চান এবং পরিবর্তে গিট-আরএম [1] ব্যবহার করতে প্রতিশ্রুতি দিন

সর্বশেষে তবে অন্তত না, যদি আপনি না করেন তবে আপনি কাজ git commitকরার সময় একটি ত্রুটি পাবেন / পাবেন git submodule summary(গিট ২.7 হিসাবে):

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

আপনি পদক্ষেপ 2 বা 3 করেন তা নির্বিশেষে এটি।


7
project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

7

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

লক্ষ্য করা কেউ ম্যানুয়াল মুছে ফেলা পোস্ট করেনি, তাই যুক্ত



7

গিট ২.১17 এবং তারপরে এটি ঠিক:

git submodule deinit -f {module_name}
git add {module_name}
git commit

কাজ করেনি, না হয়ও git 2.17.1নয় git 2.20.1। তবে উভয়ের জন্য git rmপরিবর্তে ব্যবহার করে git add। দ্রষ্টব্য: জিনিসগুলি পরিষ্কার থাকলে -fপ্রয়োজন হয় না । করতে ভুলবেন না অপশন ব্যবহার না সঙ্গে gitআপনি অনিচ্ছাকৃত ডেটা হারিয়ে বিরুদ্ধে রক্ষা করতে চাই। এছাড়াও লক্ষ করুন যে এটি .git/modules/{module_name}জায়গায় রয়েছে। এটি সেখানে রাখা ভাল অনুশীলন কারণ gitসঠিক কারণে প্রিন্ট করা (!) যদি এর কারণে কোনও কিছু অবরুদ্ধ থাকে তবে কীভাবে এগিয়ে যেতে সাহায্য করে help
টিনো

4

আপনি যদি কেবল সাব-মডিউল যুক্ত করেছেন, এবং উদাহরণস্বরূপ, আপনি কেবল ভুল সাবমোডুল যুক্ত করেছেন বা আপনি এটি ভুল জায়গায় যুক্ত করেছেন, কেবল git stashফোল্ডারটি মুছুন। এটি ধরে নেওয়া হচ্ছে যে সাম্প্রতিক রেপোতে আপনি কেবলমাত্র সাবডমডিউলটি যুক্ত করেছিলেন।


3

পাঠকের উপকারের জন্য, এখানে এটি সংক্ষিপ্ত করার চেষ্টা করে এবং জিনিসগুলি প্রত্যাশা অনুযায়ী কাজ না করে কীভাবে এটি করা যায় তার জন্য একটি ধাপে ধাপে গাইড দেওয়ার চেষ্টা করে। অনুসরণ করা হয় পরীক্ষিত এবং নিরাপদ উপায় জন্য 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
    • (1) আপডেট .git/config
  • 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 আপনি সম্ভবত এটি অনুমান করেছেন: হিলবিক্সটি আমার গিটহাব অ্যাকাউন্ট।


কোনও পোস্টের এই এনসাইক্লোপিডিয়াকে প্রকৃত উত্তরটি এবং বিভিন্ন "সমস্যা সমাধান /" ইত্যাদি বিভাগগুলি নির্দেশ করতে বড় / ক্লিয়ারার সাব হেডিং সহ আরও পরিষ্কার বিভাগে বিভক্ত করা উচিত।
অ্যান্ড্রু

2

সংক্ষিপ্তসার হিসাবে, এটি আপনার করা উচিত:

পাথ_টো_সুবমডুল ভেরি সেট করুন (কোনও পিছনে স্ল্যাশ নেই):

path_to_submodule=path/to/submodule

.Gitmodules ফাইল থেকে প্রাসঙ্গিক লাইন মুছুন:

git config -f .gitmodules --remove-section submodule.$path_to_submodule

.Git / কনফিগার থেকে প্রাসঙ্গিক বিভাগটি মুছুন

git config -f .git/config --remove-section submodule.$path_to_submodule

আনস্টেজ করুন এবং কেবল সূচী থেকে $ path_to_submodule সরান (তথ্য হারানো রোধ করতে)

git rm --cached $path_to_submodule

.Gitmodules এ পরিবর্তনগুলি ট্র্যাক করুন

git add .gitmodules

সুপারপ্রজেক্ট প্রতিশ্রুতিবদ্ধ

git commit -m "Remove submodule submodule_name"

এখনই ট্রেড করা সাবমডিউল ফাইলগুলি মুছুন

rm -rf $path_to_submodule

rm -rf .git/modules/$path_to_submodule

আরও দেখুন: বিকল্প গাইড লাইন


'গিট সাবমডিউল অ্যাড' অনুসরণ করে কোনও সাবডমডিউল কীভাবে সরিয়ে ফেলা যায় তবে কী কখনও প্রতিশ্রুতি না দিয়ে দয়া করে এটি বাড়িয়ে দিতে পারেন? আমি ধরে নিই যে সেক্ষেত্রে সাবমডিউলটি অপসারণের জন্য কোনও প্রতিশ্রুতির দরকার নেই, তাই না?
কার্লো উড

আমার মনে হয় আপনার অদলবদল করা দরকার git rm --cached $path_to_submoduleএবং git add .gitmodulesনা? আমি প্রথম কমান্ডটিতে একটি ত্রুটি fatal: Please stage your changes to .gitmodules or stash them to proceedপেয়েছি : কারণ আমি এতে অ-স্টেজ পরিবর্তন করেছি .gitmodules। এরকম git add .gitmodulesপ্রথম সমাধান হবে।
কার্লো উড

2

এটা সহজ:

  1. থেকে বিভাগটি সরান .gitmodules
  2. কল করুন: git add .gitmodules
  3. কল করুন: git submodule deinit <path to submodule>
  4. কল করুন: git rm <path to submodule>
  5. প্রতিশ্রুতিবদ্ধ এবং পুশ

আপনাকে নিজের প্রকল্পের মডিউল ফাইলগুলি ম্যানুয়ালি মুছে ফেলতে হবে।


2
আমার জন্য এটি কল git submodule deinit <submodule_name>এবং যথেষ্ট ছিল git rm <path_to_submodule>। শেষ কমান্ডটি স্বয়ংক্রিয়ভাবে প্রবেশদ্বারটি মুছে দেয় .gitmodules। গিট 2.17
ডাইমাইট্রো ওভদিয়েনকো

1

অপসারণের প্রক্রিয়াটি সহজ করার জন্য আমি একটি বাশ স্ক্রিপ্ট তৈরি করেছি। এটি সংরক্ষণে সংরক্ষণ না করে রেখে রেপোতে পরিবর্তন রয়েছে কিনা তাও পরীক্ষা করে নিশ্চিতকরণের জন্য জিজ্ঞাসা করে। এটি পরীক্ষা করা হয়েছে os xএটি জেনে রাখা আকর্ষণীয় হবে যে এটি সাধারণ লিনাক্স ডিস্ট্রোসের মতো কাজ করে কিনা:

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f


0

সর্বশেষ গিটে গিট সাবমডিউলটি অপসারণ করার জন্য মাত্র 4 টি অপারেশন প্রয়োজন।

  • এর সাথে সম্পর্কিত এন্ট্রি সরান .gitmodules
  • মঞ্চ পরিবর্তন git add .gitmodules
  • সাবমডিউল ডিরেক্টরিটি সরান git rm --cached <path_to_submodule>
  • এটা কমিট git commit -m "Removed submodule xxx"

0

আপনার নীচের মতো বাশ স্ক্রিপ্ট সহ এক লাইন কমান্ডে এটি করতে হবে :

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

$HOMEদির নামক স্থানে বাশ স্ক্রিপ্ট ফাইল তৈরি করুন remove_submodule.sh:

#!/bin/bash

git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet


0
  • একটি সাবমডিউল চালিয়ে মুছতে পারে git rm <submodule path> && git commit। এটি ব্যবহার করে পূর্বাবস্থায় ফেরা যায় git revert
    • মুছে ফেলা সুপারপ্রজেক্টের ট্র্যাকিং ডেটা সরিয়ে দেয়, যা গিটলিংক এন্ট্রি এবং .gitmodulesফাইলের বিভাগ উভয়ই ।
    • সাবমডিউলের ওয়ার্কিং ডিরেক্টরিটি ফাইল সিস্টেম থেকে সরিয়ে ফেলা হয়েছে, তবে গিট ডিরেক্টরিটি অন্য কোনও সংগ্রহস্থল থেকে আনার প্রয়োজন ছাড়া অতীতের কমিটগুলি চেকআউট করা সম্ভব করার জন্য এটি রাখা হয়।
  • একটি সাবমডিউল সম্পূর্ণরূপে অপসারণ করতে অতিরিক্তভাবে ম্যানুয়ালি মুছুন$GIT_DIR/modules/<name>/

সূত্র: git help submodules


-1

গিট সাবমডিউল সরানো হচ্ছে

git4 টি পদক্ষেপের নীচে একটি সাবমডিউল অপসারণ করতে প্রয়োজন।

  1. .gitmodulesফাইলটিতে সংশ্লিষ্ট এন্ট্রি সরান । এন্ট্রি নীচে উল্লিখিত মত হতে পারে
[submodule "path_to_submodule"]
    path = path_to_submodule
    url = url_path_to_submodule
  1. মঞ্চ পরিবর্তন git add .gitmodules
  2. সাবমডিউল ডিরেক্টরিটি সরান git rm --cached <path_to_submodule>
  3. এটি প্রতিশ্রুতিবদ্ধ git commit -m "Removed submodule xxx"এবং ধাক্কা।

স্থানীয় ক্লোনযুক্ত অনুলিপিতে সাবমডিউলটি পুরোপুরি পরিষ্কার করার জন্য নীচে উল্লিখিত আরও 2 টি আরও পদক্ষেপের প্রয়োজন।

  1. .git/configফাইলটিতে সংশ্লিষ্ট এন্ট্রি সরান । এন্ট্রি নীচে উল্লিখিত মত হতে পারে
[submodule "path_to_submodule"]
    url = url_path_to_submodule
  1. ডু rm -rf .git/modules/path_to_submodule

এই 5th ষ্ঠ এবং 6th ষ্ঠ পদক্ষেপে এমন কোনও পরিবর্তন তৈরি হয় না যার প্রতিশ্রুতিবদ্ধতার প্রয়োজন হয়।


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