web-dev-qa-db-ja.com

相対パスとして指定されている場合、gitサブモジュールを追加できません

Gitリポジトリにサブモジュールを追加しようとしていますが、次のエラーが返されます。

remote Origin does not have a url defined in .git/config

これが何であるかについてのアイデアはありますか?グーグルで試してみましたが、あいまいなリンクが1つしか表示されません。

私はこれをやっています:

git submodule add ../extern/Lib1 lib  

これでサブモジュールが作成されると思いますlib/Lib1
これは参照を作成するだけであり、更新/初期化する必要があることを認識しています(この部分は明確ではなく、それほど進んでいません。サブモジュールコマンドを学習しているだけです)。

36
deepblue

../extern/Lib1はGitリポジトリを参照していますか?
そうでない場合、GitはGitリポジトリのURLを.gitmoduleに設定する方法を知りません。
また、次のことを試してください。

  • 宛先libnotはすでに存在します(空でも)
  • 相対パスの代わりに絶対パスを使用します(相対パスを使用できますが、念のため、ここで試してみる価値があります)

サブモジュールに関するいくつかの優れた情報源は次のとおりです。


ここでは絶対パスのみが機能するため、相対パスを比較するための参照が必要であることを意味します。
その参照は、次のように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サブモジュールのマニュアルページの次のセクションから着想を得ています。

<repository>は、新しいサブモジュールのOriginリポジトリのURLです。
これは絶対URL、または(./または../で始まる場合)スーパープロジェクトの相対的な場所Originリポジトリ

したがって、NewRepo_withSubmodulesが作成されたばかりのローカルGitリポジトリである場合(もちろん「オリジン」がない場合)、人工的な「リモートオリジン」を定義する必要があります(オリジンがそれ自体を指している場合でも)。他のサブモジュールリポジトリの相対URLを使用できるようにします。


Git 2.13(2017年第2四半期)では、サブモジュールのデフォルトのオリジンの検出が改善されます。

commit d1b3b81 (25 Feb 2017)by Stefan Beller(stefanbeller を参照してください。
(合併 濱野純雄--gitster- in commit ae900eb 、2017年3月10日)

submodule init:ローカルパスへのフォールバックについて警告

として 現在文書化されています

<repository>は、新しいサブモジュールのOriginリポジトリのURLです。
これは絶対URL、または(./または../で始まる場合)スーパープロジェクトのデフォルトのリモートリポジトリに相対的な場所のいずれかです。
(スーパープロジェクト 'foo.git'のすぐ隣にあるリポジトリ 'bar.git'を指定するには、代わりに '../foo.git'を使用する必要があることに注意してください。 './foo.git'の-相対URLのルールに従うときに予想されるように-Gitでの相対URLの評価は、相対ディレクトリの評価と同じであるため)。

デフォルトのリモートは、現在のブランチのリモートトラッキングブランチのリモートです。
そのようなリモート追跡ブランチが存在しない場合、またはHEADが切り離されている場合、「Origin」がデフォルトのリモートであると見なされます。
スーパープロジェクトにデフォルトのリモートが構成されていない場合、スーパープロジェクトはそれ自体の権限のあるアップストリームであり、現在のものです。代わりに、作業ディレクトリが使用されます。


Git 2.20(2018年第4四半期)は、サブモジュールのローカルパスサポートを改善します。

commit e0a862f (16 Oct 2018)by Stefan Beller(stefanbeller を参照してください。
(合併 Junio C Hamano --gitster- in commit 3fc8522 、06 Nov 2018)

submodule helper:必要に応じて相対URLを絶対URLに変換します

update_clone」によって呼び出されるサブモジュールヘルパーgit submodule updateは、必要に応じてサブモジュールのクローンを作成します。
サブモジュールにはアクティブかどうかを示すURLが含まれていたため、相対URLを解決する手順は「submodule init」手順で実行されました。現在、サブモジュールは、明示的なinitを呼び出さずにアクティブに構成できます。 submodule.activeの構成を介して。

この方法でアクティブに設定されているサブモジュールを取得しようとすると、.gitmodulesにあるURLにフォールバックします。これは、スーパープロジェクトに関連している可能性がありますが、まだ解決していません。

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
[...]

この問題を解決するには、「git submodule init」(init_submodule関数のサブモジュールヘルパー内)の相対URLを解決する関数を除外し、update_cloneの適切な場所で呼び出します。ヘルパー。

31
VonC

私は同じことを試みていましたが、次のことがうまくいったようです。

私は(Windows上で)持っています:


D:/phd/analyses
    /analysis1/ #This is an existing repository
    /analysis2/ #another existing repository
    /analysis3.tex
    /analysis4.tex
    ...
    /analysisN.tex

analysis1.tex ... analysisN.tex私がまだ取り組んでいないアイデア( 'スタブなど)が含まれ、analysis1/およびanalysis2/は私が取り組んでいるものです(したがって、コード、tex、...が含まれています)。他の分析に取り掛かると、それらは独自のフォルダー、つまり独自のリポジトリに移動します。

私がしたことは(分析のgit bashで):


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

よろしく、サイモンナップ

4
Simon Knapp

(ここで解決策だけを要約しました。クレジットはVonCに送られます。)

含まれているリポジトリ(たとえばcontaining.git/)では、gitは、定義されていないOriginリモートからの相対パスとして相対パスを解釈します。 containing.git/ディレクトリに対して相対的なものにしたいので、実行します。

git remote add Origin ..

(なぜそれが..ではなく.であるのかわかりません。)

これで、サブモジュールを追加できます。

git submodule add ../extern/Lib1 lib
1