gitサブモジュールとサブツリーの概念的な違いは何ですか?
それぞれの典型的なシナリオは何ですか?
gitサブモジュールとサブツリーの概念的な違いは何ですか?
それぞれの典型的なシナリオは何ですか?
回答:
リンクが常に外部リポジトリのHEADを指すようにするにはどうすればよいですか?
サブモジュールを作成して、サブモジュールのリモートリポジトリのブランチのHEADを追跡できます。
o git submodule add -b <branch> <repository> [<path>]
。(追跡するブランチを指定するため)
o デフォルトgit submodule update --remote
では、サブモジュールのコンテンツをから最新のHEADに更新<repository>/<branch>
しますorigin/master
。メインプロジェクトは、たとえ--remote
使用されている場合でも、サブモジュールのHEADのハッシュを追跡します。
add -b
を使用し、--remote
その後、更新コマンドを使用することで達成されると言っていると思います。その場合、マスターのHEADをフォローするために本当に必要ですか?-b
-b
、サブモジュールに適切な.gitmoduleメタデータを生成するために使用されます(これはと同等git config -f .gitmodules submodule.<path>.branch <branch>
です)。
--remote
- 上で使用されていない--remote
場合-b
にも機能しadd
ます。どちらの場合も、更新によってサブモジュールを格納している親リポジトリにコミットが発生するため、リンクは非常に自動的な方法で「常にHEADを指す」わけではありません...私はそれを取得しなかったか、その主張元の回答から削除することをお
概念的な違いは次のとおりです。
ではgitのサブモジュールあなたは、通常より小さなものに大きなリポジトリを分けたいです。サブモジュールを参照する方法はmavenスタイルです -他の(サブモジュール)リポジトリから単一のコミットを参照しています。サブモジュール内で変更が必要な場合は、サブモジュール内でコミット/プッシュを行う必要があります。次に、メインリポジトリで新しいコミットを参照し、メインリポジトリの変更された参照をコミット/プッシュします。その方法では、完全なビルドのために両方のリポジトリにアクセスする必要があります。
ではgitのサブツリーあなたは、その歴史を含め、あなた、で別のリポジトリを統合します。そのため、統合後、リポジトリのサイズはおそらく大きくなります(したがって、これはリポジトリを小さく保つ戦略ではありません)。統合後、他のリポジトリへの接続はありません。更新を取得する場合を除き、リポジトリにアクセスする必要はありません。したがって、この戦略はコードと履歴を再利用するためのものです。私は個人的には使用しません。
git subtree
あなたはまだプッシュすることもできます-あなたが望むなら-そうですか?
サブモジュール
がメインリポジトリをリモートにプッシュしても、サブモジュールのファイルはプッシュされません
サブツリー
がメインリポジトリをリモートにプッシュすると、サブツリーのファイルがプッシュされます
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master