كيف يمكنني إزالة submodule?
-
12-09-2019 - |
سؤال
كيف يمكنني إزالة بوابة submodule?
بالمناسبة, هل هناك سبب أنا لا يمكن أن تفعل ببساطة
git submodule rm whatever
?
المحلول
منذ git1.8.3 (نيسان / أبريل 22d, 2013):
لا يوجد الخزف طريقة لقول "أنا لم أعد أنا مهتم في هذا submodule", بمجرد التعبير عن الاهتمام في submodule مع "
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
:وهذا مذكور في دانيال شرودر's الجواب, و لخصها Eonil في التعليقات:
هذا يترك
.git/modules/<path-to-submodule>/
دون تغيير.
حتى إذا كان لديك مرة واحدة حذف submodule مع هذا الأسلوب وإعادة إضافتها مرة أخرى, لن يكون ممكنا لأن مستودع بالفعل تالف.
git rm
:انظر ارتكاب 95c16418:
تستخدم حاليا "
git rm
"على submodule يزيل submodule عمل شجرة من superproject و gitlink من الفهرس.
ولكن submodule قسم في.gitmodules
يمسها ، وهو بقايا من الآن إزالة submodule و قد تثير غضب المستخدمين (بدلا من الإعداد في.git/config
, هذا يجب أن يبقى للتذكير أن المستخدم أبدى اهتماما في هذا submodule لذلك سوف يكون من اسكانها في وقت لاحق عندما أقدم ارتكاب تم سحبه).السماح "
git rm
"تساعد المستخدم ليس فقط إزالة submodule من العمل شجرة ولكن أيضا إزالة "submodule.<submodule name>
"قسم من.gitmodules
الملف المرحلة على حد سواء.
git submodule deinit
:فإنه ينبع من هذا التصحيح:
مع "
git submodule init
"المستخدم قادرا على ان اقول بوابة أنهم يهتمون واحد أو أكثر من الوحدات الفرعية و يريد أن يكون عليه بالسكان على المكالمة التالية "git submodule update
".
ولكن حاليا لا يوجد أي طريقة سهلة ويمكن أن أقول بوابة أنها لا تهتم submodule بعد الآن و يريد التخلص من العمل المحلية شجرة (ما لم يكن المستخدم يعرف الكثير عن submodule الداخلية ويزيل "submodule.$name.url
"الإعداد من.git/config
جنبا إلى جنب مع العمل شجرة نفسه).مساعدة هؤلاء المستخدمين من خلال توفير '
deinit
'الأمر.
هذا يزيل كلsubmodule.<name>
قسم من.git/config
إما نظرا submodule(s) (أو لكل تلك التي تم تهيئة إذا '.
'وتعطى).
تفشل إذا كان العمل الحالي شجرة تحتوي على التعديلات إلا إذا اضطر.
يشكو عندما ل submodule معين على سطر الأوامر url الإعداد لا يمكن العثور عليها في.git/config
, ولكن مع ذلك لا تفشل.
هذا يهتم إذا كان (دي)التهيئة الخطوات (.git/config
و .git/modules/xxx
)
منذ git1.8.5 ، git rm
يأخذ أيضا الرعاية:
- '
add
'الخطوة التي تسجل عنوان submodule في.gitmodules
ملف:هو بحاجة إلى إزالة بالنسبة لك. - على submodule خاصة دخول (كما هو موضح من قبل هذا السؤال):بوابة rm يزيل من مؤشر:
git rm --cached path_to_submodule
(أي مائل زائدة)
التي سيتم إزالة هذا الدليل المخزنة في المؤشر مع وضع خاص "160000" ، بمناسبة أنها submodule الدليل الجذر.
إذا كنت قد نسيت أن الخطوة الأخيرة ، في محاولة لإضافة ما كان submodule العادية الدليل ، سوف تحصل على رسالة خطأ مثل:
git add mysubmodule/file.txt
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
ملاحظة:منذ جيت 2.17 (Q2 2018), بوابة submodule deinit لم يعد قذيفة النصي.
إنها دعوة إلى C وظيفة.
انظر ارتكاب 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} "$@"
نصائح أخرى
عبر الصفحة جيت نقل التعليمات التعليمية:
لإزالة المنطوب الذي تحتاجه:
- حذف القسم ذي الصلة من
.gitmodules
ملف. - المرحلة
.gitmodules
التغييرات:git add .gitmodules
- حذف القسم ذي الصلة من
.git/config
. - قم بإزالة ملفات المنفوعات من شجرة العمل وفهرس:
git rm --cached path_to_submodule
(لا مائل زائدة). - إزالة المنقط
.git
الدليل:rm -rf .git/modules/path_to_submodule
- ارتكاب التغييرات:
git commit -m "Removed submodule <name>"
- احذف الملفات المنفذة غير المستحقة الآن:
rm -rf path_to_submodule
أنظر أيضا: الخطوات البديلة أدناه.
مجرد ملاحظة. منذ GIT 1.8.5.2، ستفعل أوامران:
git rm the_submodule
rm -rf .git/modules/the_submodule
كما أشارت إجابة Cheverton الخاصة بخاصة، إذا لم يتم استخدام السطر الثاني، حتى إذا قمت بإزالة المنقطات في الوقت الحالي، فسوف يمنع المجلد RALNANT .git / modules / the_submodule نفس التنسيق المنخفض من إضافته أو استبداله في المستقبل وبعد أيضا، كما ذكر Vonc، git rm
سوف تفعل معظم الوظيفة على قائمة في المنطقية.
- update (07/07/2017) -
فقط للتوضيح، the_submodule
هو المسار النسبي للنوم داخل المشروع. على سبيل المثال، هو subdir/my_submodule
إذا كانت المنقطات داخل الدليل الفرعي subdir
.
كما أشار بشكل صحيح في التعليقات و إجابات أخرى, ، أوامران (على الرغم من أن كافية بشكل وظيفي لإزالة الأسطح المنطقية)، فاترك أثر في [submodule "the_submodule"]
قسم من .git/config
(اعتبارا من يوليو 2017)، والتي يمكن إزالتها باستخدام أمر ثالث:
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
غالبية الإجابات على هذا السؤال قديمة أو غير مكتملة أو معقدة غير ضرورية.
سيتم استنساخ المناسبات باستخدام GIT 1.7.8 أو الأحدث بأكثر من أربعة آثار نفسها في ريبو المحلي الخاص بك. يتم إعطاء عملية إزالة هذه الآثار الأربع من قبل الأوامر الثلاثة أدناه:
# 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
خطوات بسيطة
- إزالة إدخالات التكوين:
git config -f .git/config --remove-section submodule.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
- إزالة الدليل من الفهرس:
git rm --cached $submodulepath
- ارتكب
- حذف الملفات غير المستخدمة:
rm -rf $submodulepath
rm -rf .git/modules/$submodulename
يرجى الملاحظة: $submodulepath
لا يحتوي على مائل قيادة أو زائدة.
خلفية
عندما تفعل 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
في النهاية، إذا وضعت هذا في برنامج نصي.
أيضا إلقاء نظرة على إجابة على هل يمكنني إلغاء تخصيص الأسطح؟.
بالإضافة إلى التوصيات، كان علي أيضا rm -Rf .git/modules/path/to/submodule
لتكون قادرا على إضافة تنويب جديد بنفس الاسم (في حالتي، كنت أستبدل شوكة مع الأصل)
لإزالة قائمة نقل مضافة باستخدام:
git submodule add blah@blah.com:repos/blah.git lib/blah
يركض:
git rm lib/blah
هذا هو.
بالنسبة للإصدارات القديمة من GIT (Circa ~ 1.8.5) استخدم:
git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
يجب إزالة الإدخال .gitmodules
و .git/config
, ، وإزالة دليل الوحدة النمطية من التاريخ:
git rm --cached path/to/submodule
إذا كنت ستكتب على قائمة GIT البريدية ربما سيقوم شخص ما ببرنامج نصي شل لك.
يمكنك استخدام اسم مستعار لأتمتة الحلول التي يوفرها الآخرون:
[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 الخاص بك، ثم يمكنك القيام به: git rms path/to/submodule
لتلخيص، هذا هو ما يجب عليك فعله:
تعيين
path_to_submodule
فار (لا خط مائل زائدة):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
Unstage وإزالة PATH_TO_SUBMODULE فقط من الفهرس (لمنع فقدان المعلومات)
git rm --cached $path_to_submodule
تتبع التغييرات التي تم إجراؤها على .gitmodules
git add .gitmodules
ارتكاب superproject.
git commit -m "Remove submodule submodule_name"
احذف الملفات المنفذة غير المستحقة الآن
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
إذا كان المنطق بطريق الخطأ وأضاف لأنك تضاف، وارتكبت ودفع مجلد كان بالفعل مستودع جيت (الوارد .git
)، لن يكون لديك .gitmodules
ملف لتحرير، أو أي شيء في .git/config
. في هذه الحالة كل ما تحتاجه يكون :
git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push
fwiw., ، أنا أيضا إزالة .git
مجلد قبل القيام git add
.
وجدت deinit
يعمل بشكل جيد بالنسبة لي:
git submodule deinit <submodule-name>
git rm <submodule-name>
من مستندات git.:
Deinit.
إلغاء تسجيل الأسفلات المحددة، أي إزالة الكل
submodule.$name
القسم من. جيت / التكوين مع شجرة عملهم.
بعد التجربة بكل الإجابات المختلفة على هذا الموقع، انتهى بي الأمر بالحلول:
#!/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)
ما أقوم به حاليا ديسمبر 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}"
هنا هو ما فعلته:
1.) حذف القسم ذي الصلة من ملف .gitmodules. يمكنك استخدام الأمر أدناه:
git config -f .gitmodules --remove-section "submodule.submodule_name"
2.) المرحلة .gitmodules
التغييرات
git add .gitmodules
3.) حذف القسم ذي الصلة من .git/config
. وبعد يمكنك استخدام الأمر أدناه:
git submodule deinit -f "submodule_name"
4.) إزالة gitlink (لا خط مائل زائدة):
git rm --cached path_to_submodule
5.) تنظيف .git/modules
:
rm -rf .git/modules/path_to_submodule
6.) الالتزام:
git commit -m "Removed submodule <name>"
7.) حذف ملفات المنفوعات غير المستحقة الآن
rm -rf path_to_submodule
ألقيت مؤخرا عن مشروع GIT الذي يشمل العديد من الأمر المفيد GIT ذات الصلة: https://github.com/visionmedia/git-extras.
تثبيته ونوع:
git-delete-submodule submodule
ثم تتم الأمور. ستتم إزالة الدليل المنطقي من Repo الخاص بك ولا يزال موجودا في نظام الملفات الخاص بك. يمكنك بعد ذلك ارتكاب التغيير مثل: git commit -am "Remove the submodule"
.
اضطررت إلى اتخاذ خطوات جون دثات خطوة واحدة cd
في الدليل الأسود، ثم قم بإزالة مستودع GIT:
cd submodule
rm -fr .git
ثم استطعت ارتكاب الملفات كجزء من مستودع الوالد GIT دون الإشارة القديمة إلى تنوع.
فيما يلي الخطوات الأربعة التي وجدت ضرورية أو مفيدة (منها أولا):
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 يجب أن تعتني به. نأمل أن يجيب الرد على الجزء الثاني من سؤال OP بشكل إيجابي في يوم واحد (يمكن القيام بذلك في أمر واحد).
ولكن اعتبارا من يوليو 2017، الخطوة 2 ضروري لإزالة البيانات في .git/modules/
بالنسبة إلى خلاف ذلك، لا يمكنك إضافة المنقطات مرة أخرى في المستقبل.
ربما يمكنك الابتعاد عن الخطوتين أعلاه ل GIT 1.8.5+ كما إجابة tinlyx لاحظ، كما الجميع git submodule
يبدو أن الأوامر تعمل.
الخطوة 3 يزيل القسم ل the_submodule
في الملف .git/config
. وبعد يجب أن يتم ذلك من أجل الاكتمال. (قد يتسبب الإدخال في مشاكل في إصدارات GIT القديمة، لكن ليس لدي اختبار واحد).
لهذا، تشير معظم الإجابات إلى استخدام git submodule deinit
. وبعد أجد أنه أكثر صراحة وأقل مربكة للاستخدام git config -f .git/config --remove-section
. وبعد بحسب ال وثائق الجيت, git deinit
:
إلغاء تسجيل الأسفلات المحددة ... إذا كنت ترغب حقا في إزالة تنشيط من المستودع والالتزام باستخدام GIT-RM [1 في حين أن.
أخيرا وليس آخرا، إذا لم تفعل ذلك git commit
, ، سوف تحصل على خطأ عند القيام به git submodule summary
(اعتبارا من GIT 2.7):
fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:
هذا هو بغض النظر عما إذا كنت تفعل الخطوات 2 أو 3.
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
لقد وجدت للتو. الملفات المخفية .submodule (نسيت الاسم الدقيق)، لديه قائمة ... يمكنك محوها بشكل فردي بهذه الطريقة. أنا فقط كان واحدا، لذلك حذفت ذلك. بسيطة، ولكن قد فوضى جيت، لأنني لا أعرف ما إذا كان أي شيء مرتبط بالنوع. يبدو موافق حتى الآن، بصرف النظر عن قضية الترقية المعتادة في LIBETPAN، ولكن هذا (نأمل) لا علاقة لها.
لاحظت أحدا نشر محو اليدوية، لذلك أضيفت
إذا كنت قد أضفت فقط المنقطات، وعلى سبيل المثال، فأضفت ببساطة المنقطات الخاطئة أو أضفتها إلى المكان الخطأ، فما عليك سوى القيام بذلك git stash
ثم حذف المجلد. هذا يفترض أن تضيف التسويق هو الشيء الوحيد الذي قمت به في الريبو الأخير.
مع GIT 2.17 وفوق الأمر فقط:
git submodule deinit -f {module_name}
git add {module_name}
git commit
لقد قمت بإنشاء برنامج نصي باش لتخفيف عملية الإزالة. كما أنه يتحقق مما إذا كانت هناك تغييرات في ريبو غادرت غير محفوظة وتسأل عن تأكيد. تم اختباره على os x
سيكون من المثير للاهتمام معرفة ما إذا كان يعمل كما هو الحال في توزيعة Linux المشتركة كذلك:
https:gist.gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f.
في أحدث جيت فقط، هناك حاجة لعملية إزالتها إلى نقل GIT.
- إزالة الدخول المقابل في
.gitmodules
- التغييرات المرحلة
git add .gitmodules
- إزالة الدليل المنطقي
git rm --cached <path_to_submodule>
- ارتكبت
git commit -m "Removed submodule xxx"
في حال كنت بحاجة إلى القيام بذلك قيادة سطر واحد مع برنامج نصي باش على النحو التالي:
$ 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