لا يمكن إضافة وحدة فرعية git عند تحديدها كمسار نسبي
-
21-09-2019 - |
سؤال
أحاول إضافة وحدة فرعية إلى ريبو git الخاص بي ، وأحصل على هذا الخطأ في المقابل:
remote origin does not have a url defined in .git/config
أي أفكار حول ما قد يكون هذا؟ حاولت googling لذلك ولكن رابط واحد غامض فقط يأتي.
أنا أقوم بفعل هذا:
git submodule add ../extern/Lib1 lib
أتوقع أن يقوم هذا بإنشاء وحدة فرعية lib/Lib1
أدرك أن هذا لن ينشئ سوى مرجعًا وأن عليّ بعد ذلك التحديث/البدء (وليس واضحًا في هذا الجزء ، لم أكن قد وصلت إلى هذا الحد ؛ أنا فقط أتعلم أمر الجهاز الفرعي).
المحلول
يفعل ../extern/Lib1
الرجوع إلى مستودع GIT؟
إذا لم يحدث ذلك ، فلن يعرف Git كيف يكون عنوان URL لـ GIT REPO له .gitmodule
حاول ايضا:
- مع الوجهة
lib
ليس موجود بالفعل (حتى فارغ) - مع وجود مسار مطلق بدلاً من المسار النسبي (يمكنك استخدام مسار نسبي ، ولكن في حالة ما يستحق المحاولة هنا)
بعض المصادر الجيدة على العارض الفرعي هي:
- الفصل 8 من دليل مستخدم GIT
- صفحة wiki على تعليمي للوحدة الفرعية git
وبالطبع - صفحة رجل الجهاز الفرعي git
نظرًا لأن المسار المطلق يعمل فقط هنا ، فهذا يعني أن المسار النسبي يحتاج إلى مرجع لمقارنته.
هذه الإشارة هي "الأصل البعيد" الذي يجب أن يكون في DirName/NewRepo_withSubmodules/.git/config
ملف ، مثل ذلك:
$ cat .git/config
...
[remote "origin"]
url = /path/to/DirName/NewRepo_withSubmodules/.git
fetch = +refs/heads/*:refs/remotes/origin/*
...
إذا كان لديك هذا القسم في ../DirName/NewRepo_withSubmodules/.git/config
ملف ، يجب أن تكون قادرًا على إضافة ../Extern/Lib1
كوحدة فرعية باستخدام مسار نسبي.
كل ما سبق مستوحى من القسم التالي من صفحة GIT Submodule Man:
<repository>
هو عنوان URL لمستودع أصل الجهاز الفرعي الجديد.
قد يكون هذا إما عنوان URL مطلقًا ، أو (إذا بدأ بـ./
أو../
), الموقع بالنسبة للمشروع الفائقorigin
مخزن.
حتى إذا NewRepo_withSubmodules
هو ريبو git المحلي الذي تم إنشاؤه للتو (وبالطبع ليس له "أصل") ، يجب تعريف "الأصل البعيد الاصطناعي" (حتى لو كان الأصل يشير إلى نفسه) ، إذا فقط للسماح بعنوان URL النسبي للوحدة الفرعية الأخرى المستودعات لاستخدامها.
سيقوم GIT 2.13 (Q2 2017) بتحسين اكتشاف الأصل الافتراضي للوحدة الفرعية.
يرى ارتكاب D1B3B81 (25 فبراير 2017) بواسطة ستيفان بيلر (stefanbeller
).
(دمجها جونيو سي هامانو - gitster
-- في ارتكاب AE900EB, ، 10 مارس 2017)
submodule init
: حذر من العودة إلى مسار محلي
مثل موثق الآن:
<repository>
هو عنوان URL لمستودع أصل الجهاز الفرعي الجديد.
قد يكون هذا إما عنوان URL مطلقًا ، أو (إذا بدأ بـ./
أو../
) ، الموقع بالنسبة إلى المستودع البعيد الافتراضي لـ SuperProject
(يرجى ملاحظة ذلك لتحديد مستودع "foo.git
"التي تقع بجوار المشروع الفائق"bar.git
"، عليك استخدام"../foo.git
' بدلاً من './foo.git
' - كما قد يتوقع المرء عند اتباع قواعد عناوين URL النسبية - لأن تقييم عناوين URL النسبية في GIT مطابق لتلك الموجودة في الدلائل النسبية).جهاز التحكم عن بُعد الافتراضي هو عن بُعد من فرع التتبع عن بُعد للفرع الحالي.
إذا لم يكن هناك مثل هذا الفرع التتبع عن بُعد أوHEAD
منفصل ".origin
"من المفترض أن يكون جهاز التحكم عن بعد الافتراضي.
إذا لم يكن لدى SuperProject جهاز تحكم عن بعد افتراضي تم تكوينه ، فإن SuperProject هو المنبع الموثوق به والتيار. يتم استخدام دليل العمل بدلاً من ذلك.
GIT 2.20 (Q4 2018) يحسن دعم المسار المحلي للفيروسات الفرعية.
يرى ارتكاب E0A862F (16 أكتوبر 2018) بواسطة ستيفان بيلر (stefanbeller
).
(دمجها جونيو سي هامانو - gitster
-- في الالتزام 3FC8522, ، 06 نوفمبر 2018)
submodule helper
: تحويل عنوان URL النسبي إلى عنوان URL المطلق إذا لزم الأمرالمساعد الفرعي
update_clone
دعا "من قبل"git submodule update
"، الحيوانات المستنسخة الفرعية إذا لزم الأمر.
نظرًا لأن النزاعات الفرعية كانت لديها عنوان URL الذي يشير إلى ما إذا كانت نشطة ، فقد تم إجراء خطوة لحل عناوين URL النسبية في ""submodule init
"الخطوة. في الوقت الحاضر ، يمكن تكوين النسيج الفرعي النشط دون استدعاء init صريح ، على سبيل المثال عن طريق التكوينsubmodule.active
.عند محاولة الحصول على علامات فرعية يتم ضبطها على هذا النحو ، سنعود إلى عنوان URL الموجود في
.gitmodules
, ، والتي قد تكون بالنسبة للمشروع الفائق ، لكننا لا نحلها ، حتى الآن:git clone https://gerrit.googlesource.com/gerrit cd gerrit && grep url .gitmodules url = ../plugins/codemirror-editor ... git config submodule.active . git submodule update fatal: repository '../plugins/codemirror-editor' does not exist fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled [...] fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting [...]
لحل المشكلة ، عوامل الوظيفة التي تحل عناوين URL النسبية في "
git submodule init
"(في المساعد الفرعي فيinit_submodule
الوظيفة) واتصل بها في المكان المناسب فيupdate_clone
المساعد.
نصائح أخرى
كنت أحاول نفس الشيء ، ووجدت أن ما يلي قد نجح:
لدي (على Windows):
D:/phd/analyses
/analysis1/ #This is an existing repository
/analysis2/ #another existing repository
/analysis3.tex
/analysis4.tex
...
/analysisN.tex
analysis1.tex ... analysisN.tex
تحتوي على أفكار لم أعمل عليها حتى الآن ('Stubs ، على سبيل المثال) ، و analysis1/
و analysis2/
هي الأشياء التي أعمل عليها (وبالتالي لدي رمز ، تكس ، ... فيها). بمجرد أن أتجول في العمل على التحليلات الأخرى ، سيتم نقلهم إلى مجلداتهم الخاصة ، وبالتالي مستودعاتهم الخاصة.
ما فعلته كان (في Git Bash in Analyzes):
git init
git add *.tex
git remote add self .
git submodule add self:/analysis2/.git analysis2
git submodule add self:/analysis5/.git analysis5
git commit -m "Initial commit"
ويبدو أن ذلك عمل.
D:/phd/analyses/.git/config
يبدو أنه ينبغي ، و .gitmodules
يشبه:
[submodule "analysis2"]
path = analysis2
url = self:analysis2/.git
[submodule "analysis5"]
path = analysis5
url = self:analysis5/.git
التحيات ، سيمون ناب
(لقد لخصت الحل فقط هنا. الائتمان يذهب إلى Vonc.)
في المستودع المحتوي (قل containing.git/
), git
يفسر المسارات النسبية نسبة إلى origin
عن بُعد ، والذي لم يتم تعريفه. نريد أن تكون بالنسبة إلى containing.git/
دليل ، حتى تشغيل
git remote add origin ..
(لست متأكدًا لماذا ..
عوضا عن .
.)
الآن يمكنك إضافة الوحدة الفرعية:
git submodule add ../extern/Lib1 lib