11

gitの拡張機能であるAveryPennarunのgit-subtreeを使用しています。

git subtreeを使用して、サブリポジトリからメインリポジトリへのコミットをチェリーピックするにはどうすればよいですか?また、そのプレフィックスでgitサブツリープルを実行した後、サブリポジトリの履歴で特定のコミットに移動するにはどうすればよいですか?

私は主にこれをスカッシュコミットモードで実行しています。

4

1 に答える 1

7

サブリポジトリの履歴で特定のコミットに移動するにはどうすればよいですか?

コミットを squash した場合、squash はさまざまなコミットを失うため、方法はありません。

それ以外の場合、圧縮されていないサブツリーを使用すると、サブツリーが作成された元のリポジトリにあるものと同じハッシュを使用して、サブツリーの任意のコミットに移動できます。

git subtree(スカッシュなしで)実際には、外部リポジトリからの関連するすべてのコミットを、現在のリポジトリ内の独立したツリーとしてリポジトリに追加します。を実行するgit subtree addと、いくつかのコミット (外部リポジトリからのすべての元のコミット) と、そのサブツリーからオプションで指定された特定のディレクトリにコンテンツを移動する最後のマージ コミットが追加されていることがわかり--prefixます。簡単に言えば、関連のない別のリポジトリからブランチをチェックアウトし、すべてのコンテンツを特定のサブフォルダーに移動して、現在のブランチにマージします。

これはすべて、外部レポの履歴が利用可能であることを意味します。完全に異なるツリーであるため、このチェックアウトはおそらくワークスペースのすべてのコンテンツを変更することを念頭に置いて、そのようにチェックアウトできます。プロジェクトは長くなる可能性があります。

これで 2 番目に進みます。

git subtree を使用して、サブリポジトリからメインリポジトリにコミットをチェリーピックするにはどうすればよいですか?

git subtreeそれ自体でサポートされている現在の「チェリーピッキング」はないようです。しかし、上記のすべての意味を考えると、次のことができます。

# move yourself to the subtree commit of your choice
git checkout <subtree-hash>

# fetch commits from the subtree repository, to have available the commit you want
# to cherry pick.
git fetch <path-to-remote>

# cherry pick the hash you want
git cherry-pick <cherry-hash>

# move back to your original branch
git checkout <your-branch>

# subtree merge your cherry pick (using the previous HEAD),
# so that it gets moved to the correct location specified by prefix.
git subtree merge --prefix <subtree-prefix> HEAD@{1}

# Since you probably fetched more commits that you needed from
# the remote, you might want to clean those that where not needed
git gc

これを行った後、サブツリーに更新を加えようとするとgit subtree pull、選択したコミットが含まれている場合、同じ場所に 2 つの変更があるため、競合が発生することを考慮してください。

別のより簡単なオプションは、元のサブツリー リポジトリにアクセスできる場合、ブランチでチェリー ピックを作成し、次にgit subtree pullその特定のブランチだけを選択することです。

于 2013-01-17T01:08:18.653 に答える