gitサブモジュールとサブツリーの違い


300

gitサブモジュールとサブツリーの概念的な違いは何ですか?

それぞれの典型的なシナリオは何ですか?


3
これは、すべてのご質問にお答えしますが、件名に興味深い読み物ではありません可能性がありますblogs.atlassian.com/2013/05/...
チョップ


"Gitのサブモジュールの代替?":stackoverflow.com/questions/6500524/...
brillout

回答:


177

リンクが常に外部リポジトリのHEADを指すようにするにはどうすればよいですか?

サブモジュールを作成して、サブモジュールのリモートリポジトリのブランチのHEADを追跡できます。

o git submodule add -b <branch> <repository> [<path>]。(追跡するブランチを指定するため)
o デフォルトgit submodule update --remoteでは、サブモジュールのコンテンツをから最新のHEADに更新<repository>/<branch>しますorigin/master。メインプロジェクトは、たとえ--remote使用されている場合でも、サブモジュールのHEADのハッシュを追跡します。



:あなたの答えはここに答えを投票に逆らうように見えるstackoverflow.com/questions/10443627/...
ネイサンH

@NathanH this(HEADを追跡する可能性あり)が1年後に追加されました(2013年3月、git 1.8.2:github.com/git/git/blob/…
VonC

サブモジュールのフォローシップの動作は、他の回答にも記載されています。その場合、サブモジュールのHEADを常に指すことは、サブモジュールの更新ドキュメントに従って、両方add -bを使用し、--remoteその後、更新コマンドを使用することで達成されると言っていると思います。その場合、マスターのHEADをフォローするために本当に必要ですか?-b
Matanster 2015年

@mattは-b、サブモジュールに適切な.gitmoduleメタデータを生成するために使用されます(これはと同等git config -f .gitmodules submodule.<path>.branch <branch>です)。
VonC、2015年

次に、有効化とはほとんど関係がありません--remote- 上で使用されていない--remote場合-bにも機能しaddます。どちらの場合も、更新によってサブモジュールを格納している親リポジトリにコミットが発生するため、リンクは非常に自動的な方法で「常にHEADを指す」わけではありません...私はそれを取得しなかったか、その主張元の回答から削除することをお
勧めし

351

サブモジュールはリンクです。

サブツリーはコピーです


121

概念的な違いは次のとおりです。

ではgitのサブモジュールあなたは、通常より小さなものに大きなリポジトリを分けたいです。サブモジュールを参照する方法はmavenスタイルです -他の(サブモジュール)リポジトリから単一のコミットを参照しています。サブモジュール内で変更が必要な場合は、サブモジュール内でコミット/プッシュを行う必要があります。次に、メインリポジトリで新しいコミットを参照し、メインリポジトリの変更された参照をコミット/プッシュします。その方法では、完全なビルドのために両方のリポジトリにアクセスする必要があります。

ではgitのサブツリーあなたは、その歴史を含め、あなた、で別のリポジトリを統合します。そのため、統合後、リポジトリのサイズはおそらく大きくなります(したがって、これはリポジトリを小さく保つ戦略ではありません)。統合後、他のリポジトリへの接続はありません。更新を取得する場合を除き、リポジトリにアクセスする必要はありません。したがって、この戦略はコードと履歴を再利用するためのものです。私は個人的には使用しません。


しかし、git subtreeあなたはまだプッシュすることもできます-あなたが望むなら-そうですか?
Ixx

@lxxリポジトリのURLがわかっている場合...
Franklin Yu

@FranklinYuなぜ彼はそれを知らないのでしょうか?ローカルのgitメタデータからその情報を取得できませんか?
adi518

@ adi518はい、あなたがサブツリーを作成した人なら。ただし、リポジトリをGitHubにプッシュし、他の人がそれを複製した場合、サブツリーのURLが自動的に認識されるとは思いません。
フランクリンユー

@NiklasP-「メインリポジトリの新しいコミットの参照」について詳しく説明できますか?これは、実行方法が明確でない1つのステップであるため、「変更された参照」も私が理解しているものではありません。
ロバートオシュラー

21

サブモジュール
がメインリポジトリをリモートにプッシュしても、サブモジュールのファイルはプッシュされません

サブツリー
がメインリポジトリをリモートにプッシュすると、サブツリーのファイルがプッシュされます


3
「メインリポジトリをリモートにプッシュすると、サブツリーのファイルがプッシュされます」いいえ、そうではありません。
Jブランブル2017年

@JBramble私はおそらくそれがSourceTreeアプリで行われることを言及する必要があります。例:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.