1. ホーム
  2. git

[解決済み] git subtreeはいつ使うのか?

2023-02-09 01:14:55

質問

どのような問題があるのでしょうか? git subtree はどのような問題を解決するのでしょうか? いつ、なぜ、その機能を使うべきなのでしょうか?

というのを読んだことがあります。 はリポジトリの分離に使用されます . しかし、なぜ私は無関係な2つのリポジトリを1つにくっつけるのではなく、独立した2つのリポジトリを作成しないのでしょうか?

この GitHub のチュートリアルでは Git サブツリーのマージの方法 .

私はなんとなく どのように を使うことはできますが いつ (ユースケース)と なぜ とはどのような関係なのか、そして git submodule . サブモジュールを使うのは、他のプロジェクトやライブラリに依存している場合ですね。

どのように解決するのですか?

という言葉を使うときは、何について話しているのかを明示的に記すように注意する必要があります。 'サブツリー' の文脈で git のコンテキストにあるように、実際には2つの別々の、しかし関連したトピックがここにあります。

git-サブツリー git サブツリーマージ戦略 .

TL;DRについて

サブツリー関連の概念はいずれも、複数のリポジトリを効果的に1つにまとめて管理することを可能にします。 とは対照的に git-submodule という形式でメタデータのみをルートリポジトリに保存するのとは対照的です。 .gitmodules という形でルートリポジトリに保存され、外部リポジトリは個別に管理する必要があります。

詳細

git サブツリーマージ戦略 は、基本的にあなたが参照したコマンドを使ったより手動的な方法です。

git-サブツリー は、より自然な構文を実現するためのラッパー・シェルスクリプトです。これは実際にはまだ contrib の一部であり、通常の man ページと一緒に git に完全に統合されているわけではありません。 そのため ドキュメント はスクリプトと一緒に保存されます。

以下は使用法です。

NAME
----
git-subtree - Merge subtrees together and split repository into subtrees


SYNOPSIS
--------
[verse]
'git subtree' add   -P <prefix> <commit>
'git subtree' add   -P <prefix> <repository> <ref>
'git subtree' pull  -P <prefix> <repository> <ref>
'git subtree' push  -P <prefix> <repository> <ref>
'git subtree' merge -P <prefix> <commit>
'git subtree' split -P <prefix> [OPTIONS] [<commit>]

私は自分自身のブログ記事を書くことを計画していたので、サブツリーの主題に関するかなり多くのリソースに出会いました。 もしそうするならば、この記事を更新しますが、今のところ、ここに手元の問題に関連するいくつかの情報があります。

あなたが探しているものの多くは、次のサイトで見つけることができます。 このアトラシアンブログ ニコラ・パオルッチ をクリックすると、以下の関連セクションが表示されます。

<ブロッククオート

なぜサブモジュールの代わりにサブツリーを使うのですか?

いくつかの理由があります。 を見つけるかもしれません。 subtree を使う方が良い。

  • シンプルなワークフローの管理が容易です。
  • 旧バージョンの git はサポートされています (以前の v1.5.2 ).
  • の直後にサブプロジェクトのコードを利用できます。 clone が終了した直後に利用可能になります。
  • subtree を使うことで、リポジトリのユーザーは何も新しいことを学ぶ必要がなく、無視することができます。 subtree を使っているという事実を無視できます。
  • subtree のような新しいメタデータファイルを追加することはありません。 submodules のように新しいメタデータファイルを追加することはありません(つまり .gitmodule ).
  • モジュールのコンテンツは、依存関係を別のリポジトリにコピーすることなく変更できます。 依存関係をどこか別のリポジトリにコピーすることなく、モジュールの内容を変更することができます。

私の意見では、欠点は許容範囲内です。

  • 新しいマージ戦略について学ばなければならない (すなわち subtree ).
  • コードのコントリビューションバック upstream をサブプロジェクトに戻すことは少し複雑です。
  • スーパープロジェクトとサブプロジェクトのコードをコミットで混在させない責任は、あなたにあります。

私もこれに大いに同意します。 一般的な使用方法について説明されているので、この記事をチェックすることをお勧めします。

お気づきの方もいらっしゃるかもしれませんが、彼はまた、次のような記事も書いています。 はこちら で、このアプローチで省かれる重要なディテールに言及しています...。

git-subtree は現在、リモートを含めることに失敗しています!

この短絡的な考え方は、おそらくサブツリーを扱うときにリモートを手動で追加することが多いためだと思いますが、これはgitにも保存されていません。 著者は、このメタデータをコミットに追加するために彼が書いたパッチを詳しく説明しています。 git-subtree がすでに生成しているコミットにこのメタデータを追加するために、彼が書いたパッチについて詳しく説明しています。 これが公式の git メインラインに入るまでは、コミットメッセージを変更したり別のコミットに格納したりすることで同様のことができます。

また このブログの記事 も非常に有益なものです。 この著者は、3つ目のサブツリー・メソッドとして git-stree を追加しています。 この記事は、3つのアプローチをうまく比較しており、一読の価値があります。彼は、何が好きで何が嫌いかについての個人的な意見を述べ、なぜ 3 番目のアプローチを作成したのかを説明しています。

おまけ

終了の挨拶

このトピックでは git の威力と、特徴が的外れな場合に発生する可能性のあるセグメンテーションの両方を示しています。

私は個人的に git-submodule は、投稿者が理解するのをより混乱させると思うからです。また、私は ALL で管理することを好んでいます。複数のリポジトリを管理することなく、簡単に再現可能な環境を促進するためです。 git-submodule しかし、現在ではよりよく知られているので、それを知っておくことは明らかに良いことですし、あなたの読者によっては、それがあなたの決断を揺るがすかもしれません。