سؤال

كيف يمكنني إزالة بوابة 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} "$@"

نصائح أخرى

عبر الصفحة جيت نقل التعليمات التعليمية:

لإزالة المنطوب الذي تحتاجه:

  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

أنظر أيضا: الخطوات البديلة أدناه.

مجرد ملاحظة. منذ 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

خطوات بسيطة

  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 لا يحتوي على مائل قيادة أو زائدة.

خلفية

عندما تفعل 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

لتلخيص، هذا هو ما يجب عليك فعله:

  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. Unstage وإزالة PATH_TO_SUBMODULE فقط من الفهرس (لمنع فقدان المعلومات)

    git rm --cached $path_to_submodule

  5. تتبع التغييرات التي تم إجراؤها على .gitmodules

    git add .gitmodules

  6. ارتكاب superproject.

    git commit -m "Remove submodule submodule_name"

  7. احذف الملفات المنفذة غير المستحقة الآن

    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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top