6

メイン プロジェクトにサブプロジェクトを含めたいが、アップストリームに変更を加えたくない場合、どのような最適化が存在しますか (git サブツリーの代替も含む)?

実際の使用例:既存の Express.js Web サイト (lib/Ghost など) にGhostを埋め込んでいます。私はそれにいくつかのハックを行う必要があります.とにかくアップストリームに貢献したくないタイプです. Ghost プロジェクトへの通常の貢献は、私の他のプロジェクト内からではなく、GitHub での典型的なフォークを介して行われます。

したがって、Ghost をプロジェクトに最初に組み込んだ後は、時折ローカル ソース コードが変更されるだけでなく、マスター ブランチからの更新のためにアップストリームからフェッチされることもあります。

そのようなシナリオでは、git subtree はまだ適切なアプローチですか? その場合、アップストリームに貢献する必要がないため、適用される落とし穴や単純化がありますか? したがって、最初に Ghost をフォークしてからフォークをプロジェクトのアップストリームにするのではなく、メインの TryGhost/Ghost リポジトリをアップストリームのサブツリーとして持つことも可能でしょうか?

4

1 に答える 1

6

Subtree は、私にはぴったりのように思えます。

ローカルに変更を加えている場合は、サブモジュールよりもサブツリーの方が適していると思います。

  1. プロジェクトを複製する人は、サブモジュールの場合のように追加のコマンドを実行する必要はありません。
  2. 加えた変更はサブプロジェクトのコピーに直接行われ、他の人がそれらの変更を同期するためにサブモジュールの場合のようにアクセスできるように公開リポジトリにプッシュする必要はありません。
  3. アップストリームからプルするのは簡単です。あなたのプロジェクトで作業している他の人が git サブツリーを持っていなくても問題ありません (アップストリームでマージまたは分割しないだけです)。

私が考えることができる唯一の欠点は、リポジトリにサブプロジェクトの完全なコピーがあることですが、それがスーパープロジェクトにとってオプションの巨大なプロジェクトでない限り、それを気にする人はいますか?

  • サブプロジェクトのブランチを作成する必要はありません。

    git subtree add --prefix Ghost --squash -m "Adding Ghost." https://github.com/TryGhost/Ghost.git master
    

    その時点から自由に変更を加えることができ、元が Ghost デポから来たという事実を完全に無視できます。上記の例からわかるように、リモコンを追加する必要さえありません。

  • 頻繁にプルする場合は、リモートを作成することをお勧めします。

    git remote add ghost https://github.com/TryGhost/Ghost.git
    git subtree pull --prefix=Ghost --squash -m "Updating Ghost." ghost master
    
  • 最後に、後でアップストリーム、フォーク、またはその他の場所に貢献することを決定した場合でも、サブプロジェクトに関連する部分をブランチに分割し、変更をプッシュするだけで本当に簡単です。そのブランチから fork リポジトリへ。

    git subtree split -p Ghost -b Ghost-contrib-br --rejoin
    # this should switch to the branch with only the ghost files
    
    git push <remote-contrib-repo>
    

    注:--squash履歴は、追加または最後の変更以降に変更したものだけになるため、使用しませんでした--rejoin

    --rejoin分割コマンドが次の分割の最適な開始点を認識できるように、スーパープロジェクトにコミットする一種の不十分なハックです。将来的には、これは .git/config という新しいセクションから管理されると思います (自分でそうするかもしれません)。

于 2014-03-03T02:24:51.150 に答える