サブディレクトリにサブモジュールを追加するにはどうすればよいですか?


310

~/.janus/たくさんのサブモジュールが入っているgitリポジトリがあります。にサブモジュールを追加したいのですが、ディレクトリで~/.janus/snipmate-snippets/snippets/実行するgit submodule add <git@github.com:...>snipmate-snippets、次のエラーメッセージが表示されます。

You need to run this command from the toplevel of the working tree.

だから問題は:サブモジュールをsnipmate-snippetsディレクトリに追加するにはどうすればよいですか?


サブモジュールコマンドのgitリポジトリのルートディレクトリに移動する必要はなくなります(間もなく)。以下の私の回答を
VonC 2013

3
git submodule add -b <branch> <url> <relative_path_4m_root>
parasrish

回答:


439

あなたは入り~/.janus、実行します:

git submodule add <git@github ...> snipmate-snippets/snippets/

サブモジュール(または一般的にgit)に関する詳細情報が必要な場合は、ProGitが非常に役立ちます。


追加しない場合はブランチを追加することをお勧めします。そうでなければHEADは簡単に切り離されます:git submodule add -b <branch> <repository> [<submodule-path>]
deann

1
私にはこれが原因でした'subprojects' already exists in the index (ディレクトリ名としてサブプロジェクトを使用していました)。代わりに何を、助けたことはすなわちやって、以下VonCの答えはcd subprojects、その後、git submodule add <get@github …>パスなし。
Hi-Angel

83

git1.8.4(2013年7月)以降、ルートディレクトリに戻る必要がなくなることに注意してください。

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

Bouke Versteegh は、:のように、使用する必要がないとコメントしています)/.snippets/.snippets

commit 091a6eb0feed820a43663ca63dc2bc0bb247bbaeを参照してください。

サブモジュール:最上位の要件を削除

新しいrev-parse --prefixオプションを使用して、サブモジュールコマンドに指定されたすべてのパスを処理し、リポジトリのトップレベルから実行する必要をなくします。

相対サブモジュールURLの解釈は「remote.origin.url」が構成されているかどうかに依存するgit submodule addため、作業ツリーの最上位にない場合、「」で相対URLを明示的にブロックします。

サインオフ:John Keeping

コミットに依存12b9d32790b40bf3ea49134095619700191abf1f

これによりgit rev-parse、リポジトリの指定されたサブディレクトリから呼び出されたかのように動作します。ただし、出力するファイルパスの先頭には、作業ツリーの最上部からのフルパスが付いています

これはcd、作業ツリーの最上位に移動したいが、コマンドラインでユーザーが指定した相対パスを処理する必要があるシェルスクリプトに役立ちます。


まことにありがとうございます!末尾/.が不要であることに気づきました、gitはそれなしでディレクトリスニペットを作成します。
Bouke Versteegh 2014

@BoukeVersteegh興味深い。より見やすくするために、回答にコメントを含めました。
VonC、2014

私はgitバージョン2.7.4を使用していますが、それでもこのエラーメッセージが表示されますRelative path can only be used from the toplevel of the working tree。私がやっていますgit submodule add ../../../functest
FlyingAura

@ user3426358はい、それは予想されます。ルートフォルダーだけでなく、メインリポジトリのサブフォルダーからgitサブモジュール追加を実行する機能に関する上記の回答。サブモジュールのリモートリポジトリを相対パスで参照することではありません。その場合、表示されるエラーメッセージが表示されます。
VonC

@ user3426358そしてところで、そのエラーメッセージ(表示される: " Relative path can only be used from the toplevel of the working tree")は元の質問( " ")からのものではありませんYou need to run this command from the toplevel of the working tree
VonC

17

私も同様の問題を抱えていましたが、GUIツールを使用して自分を隅々まで描いていました。

自分のgitリポジトリにチェックインするのではなく、これまでコピーしたファイルがいくつかあるサブプロジェクトがありました。サブフォルダーにレポを作成し、コミット、プッシュなどをうまく行うことができました。しかし、親リポジトリでは、サブフォルダーはサブモジュールとして扱われず、そのファイルは依然として親リポジトリによって追跡されていました。

この混乱から抜け出すには(ファイルを削除せずに)サブフォルダーの追跡を停止するようにGitに指示する必要がありました。

proj> git rm -r --cached ./ui/jslib

次に、そこにサブモジュールがあることを伝える必要がありました(現在gitによって追跡されているものがある場合は、これを実行できません)。

proj> git submodule add ./ui/jslib

更新

これを処理する理想的な方法は、さらにいくつかのステップを含みます。理想的には、既存のリポジトリは、親のgitモジュールを含まない独自のディレクトリに移動され、コミットされてプッシュされ、次のようなサブモジュールとして追加されます。

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

これにより、gitリポジトリがサブモジュールとしてクローンされます。これには、標準のクローン作成手順が含まれますが、gitがサブモジュールを機能させるためにgitが代わって行うその他のいくつかのあいまいな設定手順も含まれます。最も重要な違いは、実際のgitディレクトリが存在する場所へのパス参照を含む.gitディレクトリではなく、単純な.gitファイルをそこに配置することです。通常は親プロジェクトのルート.git / modules / jslibにあります。

あなたがこの方法で物事をしなければ、彼らはあなたのためにうまく機能しますが、あなたが親をコミットしてプッシュするとすぐに、別の開発者がその親を引っ張ろうとすると、あなたは彼らの人生をかなり難しくしました。独自の.git dirを含むdirのサブフォルダーに完全な.git dirがある限り、彼らがマシン上に持っている構造を複製することは非常に困難です。

したがって、移動、プッシュ、git addサブモジュールは、最もクリーンなオプションです。


16

手作業で設定ファイルを編集するのがおかしいと思う人のために、以下を追加(または変更)してもうまくいきます。

.git / config(個人設定)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules(コミットされた共有構成)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

これも参照してください-.gitmodulesと.git / configでサブモジュールを指定することの違いは?


2

上記のChrisの回答を支援するための1行のbashスクリプト。私は自分の隅に自分自身を描き、.vimスクリプトのVundle更新を使用していたためです。 DESTサブモジュールを含むディレクトリへのパスです。やった後にこれをしてくださいgit rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

乾杯

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.