web-dev-qa-db-ja.com

サブディレクトリにサブモジュールを追加する方法

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

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

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

254
Robert Audi

~/.janusに入り、実行します:

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

サブモジュール(あるいはgit一般)についてもっと多くの情報が必要なら ProGit はかなり役に立ちます。

366
BergmannF

git1.8.4 (2013年7月)以降は、もうルートディレクトリに戻る必要はありません。

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

Bouke Versteeghコメント/.を使用する必要はありません、 snippets/.のように:snippetsで十分です)

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

サブモジュール:トップレベルの要求をやめる

Submoduleコマンドに指定されたすべてのパスを処理するには、新しいrev-parse --prefixオプションを使用します。これは、リポジトリの最上位から実行するという要件を削除します。

相対サブモジュールURLの解釈は "remote.Origin.url"が設定されているかどうかに依存するので、ワーキングツリーのトップレベルでないときは "git submodule add"で相対URLを明示的にブロックしてください。

署名者:John Keeping

コミットに依存12b9d32790b40bf3ea49134095619700191abf1f

これは 'git rev-parse'がリポジトリの指定されたサブディレクトリから起動されたかのように振る舞いますが、印刷するファイルパスの先頭には作業パスの先頭からのフルパスが付きます。木

これは、作業ツリーの最上部までcdしたいが、コマンドラインでユーザから与えられた相対パスを処理する必要があるかもしれないシェルスクリプトにとって便利です。

72
VonC

私も同じような問題を抱えていましたが、GUIツールを使って自分自身を隅に塗りつぶしました。

私はこれまでのところ自分自身のgitリポジトリにチェックインするのではなくコピーしただけのものを入れたサブプロジェクトを持っていました。サブフォルダにリポジトリを作成し、コミット、プッシュなどができました。しかし親リポジトリでは、サブフォルダはサブモジュールとして扱われず、そのファイルはまだ親リポジトリによって追跡されていました - ダメ。

この混乱から抜け出すには、 (ファイルを削除せずに)サブフォルダーの追跡を停止するようにGitに指示しなければなりませんでした

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

それから私はそれにサブモジュールがあったことを伝えなければなりませんでした(現在gitによって追跡されているものがあるならそれはあなたができません):

proj> git submodule add ./ui/jslib

更新

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

proj> git submodule add [email protected]:user/jslib.git ui/jslib

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

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

そのため、移動、プッシュ、サブモジュールのgit追加が最もクリーンなオプションです。

17
Chris Moschini

手動で設定ファイルを編集することの私の奇妙な好みを共有するあなたの人々のために、以下を追加する(または修正する)こともトリックをするだろう。

。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でサブモジュールを指定することの違い -

15
yoniLavi

上のクリスの答えを手助けするためのワンライナーbashスクリプト。 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

乾杯

2
Rick R