[解決済み] git subtreeはいつ使うのか?
質問
どのような問題があるのでしょうか?
git subtree
はどのような問題を解決するのでしょうか?
いつ、なぜ、その機能を使うべきなのでしょうか?
というのを読んだことがあります。 はリポジトリの分離に使用されます . しかし、なぜ私は無関係な2つのリポジトリを1つにくっつけるのではなく、独立した2つのリポジトリを作成しないのでしょうか?
この GitHub のチュートリアルでは Git サブツリーのマージの方法 .
私はなんとなく
どのように
を使うことはできますが
いつ
(ユースケース)と
なぜ
とはどのような関係なのか、そして
git submodule
. サブモジュールを使うのは、他のプロジェクトやライブラリに依存している場合ですね。
どのように解決するのですか?
という言葉を使うときは、何について話しているのかを明示的に記すように注意する必要があります。
'サブツリー'
の文脈で
git
のコンテキストにあるように、実際には2つの別々の、しかし関連したトピックがここにあります。
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
しかし、現在ではよりよく知られているので、それを知っておくことは明らかに良いことですし、あなたの読者によっては、それがあなたの決断を揺るがすかもしれません。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] サブディレクトリを別のGitリポジトリに切り離す(移動する)。
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedmaster -> master (non-fast-forward) と git ! [拒否] master -> master (フェッチファースト)
-
git pull reports エラー: :cannot open .git/FETCH_HEAD:Permission denied (.git/FETCH_HEADを開くことができません。
-
エラーが発生しました。マージされていないファイルがあるため、プリングはできません
-
Git がエラーを報告しました。現在のブランチの先端が遅れているため、更新が拒否されました。
-
[Gitラーニングノート】Gitのコンフリクト:マージする前に変更をコミットするかstashする。
-
[解決済み] サブディレクトリを別のGitリポジトリに切り離す(移動する)。
-
git reports an error fatal: unable to auto-detect email address (got 'Administrator@MS-20180504MMDH.(none)')
-
Gitのコミットでfatal: unable to auto-detect email addressのエラーが報告される。
-
[解決済み] 現在のブランチにあるファイルをメインブランチにある同じファイルに上書きしますか?
-
[解決済み] Git のリモート HEAD を master 以外に指定するように変更する