لا يمكن إضافة وحدة فرعية git عند تحديدها كمسار نسبي

StackOverflow https://stackoverflow.com/questions/1974181

  •  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 ليس موجود بالفعل (حتى فارغ)
  • مع وجود مسار مطلق بدلاً من المسار النسبي (يمكنك استخدام مسار نسبي ، ولكن في حالة ما يستحق المحاولة هنا)

بعض المصادر الجيدة على العارض الفرعي هي:


نظرًا لأن المسار المطلق يعمل فقط هنا ، فهذا يعني أن المسار النسبي يحتاج إلى مرجع لمقارنته.
هذه الإشارة هي "الأصل البعيد" الذي يجب أن يكون في 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top