web-dev-qa-db-ja.com

リモートなしのネストされたgitリポジトリ(リモートなしのgitサブモジュール)

オープンソースとして部分を分割することに興味があるプロジェクトがあります。 「メイン」のgitリポジトリ(たとえば、「メイン」ディレクトリ)と「メイン/ワン」、「メイン/ツー」、「メイン/スリー」にサブリポジトリを設定しました。 「メイン」に行って

git add one
git add two
git add three

(末尾のスラッシュがないことに注意してください)、サブリポジトリを使用してサブモジュールを設定します。

ただし、 Git-追跡されていないコンテンツを追跡する方法? に記載されているように、これはgitlinkのみを作成し、実際のサブモジュールは作成しません。

残念ながら、「main/one」、「main /」のどこかに「=」elseの「マスター」リポジトリがあると想定しているため、この回答は役に立ちません。 「2」、「メイン/ 3」。これらのサブリポジトリをマスターリポジトリにbeしてほしい。 ( Git fake submodules のように)偽のサブモジュールを検討していますが、それは複製に特に理想的な状況ではありません。

他に何か提案はありますか?

30

やりたいことはできますが、onetwo、およびthreeは、クローンを作成する必要がある人がアクセスできる必要があります。これは通常、 「ランダム」な開発リポジトリ。

これを設定する場合、「your」リポジトリだけではないため、「your」リポジトリを削除しないように(または他の方法でアクセスできなくなるように)注意する必要があります。Originコラボレーターのクローン。「.gitmodules」で指定されているように、「中央」/「上流」リポジトリとして機能します。


すべてのコラボレーターがローカルであり(リポジトリーから読み取ることができる場合)、ローカルパスをURLとして指定することにより、既存のサブリポジトリーをサブモジュールとして追加できます。

git rm --cached one two three
git submodule add `pwd`/one
git submodule add `pwd`/two
git submodule add `pwd`/three

すべての共同編集者が同じマシンで作業するとは限らない場合、おそらく正しく機能しません(ローカルパスを.gitmodulesに保存するため、非ローカルの共同編集者はgit submodule initの後にURLを調整する必要があります)。

onetwo、およびthreeがリモートでGitにアクセスできる場合は、代わりに有効なURLを指定できます。

git rm --cached one two three
git submodule add server:/path/to/your/main/one
git submodule add server:/path/to/your/main/two
git submodule add server:/path/to/your/main/three

どちらの場合も、すでにサブリポジトリが設定されているため、git submodule addは、指定されたパス/ URLからクローンを作成する代わりに、それを使用します。

19
Chris Johnsen

Chris 's answer "master"リポジトリを想定しない(masterはGitのメインブランチのデフォルト名です) 、レポではありません)。

parent」リポジトリでサブモジュールを宣言します。この場合、「main」になります。

したがって、3つの独立したリポジトリ「one」「two」と「three」のセットアップが必要ですほか、それらを複製してサブモジュールとして "main"リポジトリに追加します。

# first remove the one directory previously added
git rm --cached one
# then declare the external one repo as a submodule in "main" repo)
git submodule add /path/to/one.git one
3
VonC

私は、サブモジュールのリポジトリをスーパープロジェクトのサブディレクトリとまったく同じように配置するというアイデアを思いついたところです。このようにして、プロジェクト全体は、(Chrisからの回答に基づいて)設定した1つのリポジトリ/場所にのみ依存します。

例えば。サブモジュールoneは、そのメインリポジトリとして場所server:/path/to/your/main/oneを持ちます(そのディレクトリのgit remote -vを介して)。

こうすることで、モジュール/リポジトリのURLがgit submodule update --recursive(.gitmodules)を指すため、submodule機能(例:./one)も正しい場所を指すようになります。

0
d-nnis