5

サブツリーとしていくつかのディレクトリを持つ大きなメイン プロジェクトがあります。

特定のサブツリーの変更を、別のリポジトリである元の場所にプッシュしたいと考えています。

問題は、プッシュしたい現在のサブツリーが、プッシュしたいリポジトリからのものではないことです。グーグルで見つけたサブツリーガイドを介して、別のレポから来ました。とても似ているだけです。

ビッグプロジェクトのレイアウト、important_subtree気になるところはどこ?

~/devel/bigproject
  .git/
  some_subtree/
  other_subtree/
  important_subtree/
    abc.txt
    efg.txt   <--- new version
    hij.txt

そして、important_subtreeそのレポに「強く関連している」:

~/devel/important
   .git/
    abc.txt
    efg.txt   <--- old version
    hij.txt

現在は変更されており、重要なサブツリーをリポジトリにプッシュし~/devel/bigproject/important_subtree/efg.txtたいと考えています。そのため、その後にも変更があります。~/devel/important~/devel/important/efg.txt

私がなんとかできた唯一のことは、bigprojectのすべて重要なものにプッシュすることです。これは明らかに私が望んでいることではありません。サブツリーの変更のみをプッシュする必要があります。

4

3 に答える 3

4

これはもはやそれほど複雑ではありません。リポジトリのクローンに対してgit filter-branchコマンドを使用して、不要なサブディレクトリを選別し、新しいリモートにプッシュするだけです。

git clone <ORIG_REPO_DIR> <NEW_REPO_DIR>
cd <NEW_REPO_DIR>
git filter-branch --prune-empty --subdirectory-filter <THE_SUBDIR_TO_MAKE_NEW_ROOTDIR> master
git push <MY_NEW_REMOTE_ORIGIN_URL> -f .
于 2014-08-20T14:49:13.827 に答える
3

gitにgit-subtreeを追加することをお勧めします。git subtree splitそれはあなたが望むことをするコマンドを追加します。

git subtree split --prefix=important_subtree --branch=backport <subtree merge SHA1>^.. --onto=<imported SHA1> --rejoin
git push ~/devel/important backport:master

これは、サブツリーとしてbigprojectマージしてからの変更を選択し、変更したものだけを取得します。次に、インポート元のコミットに加えて新しいコミットとしてそれらを適用し、通常の方法でプッシュバックできるブランチを作成します。また、さらに変更を加えてプロセスを繰り返したい場合に、将来コミットIDを使用する必要がないようにします。importantimportant_subtree/~/devel/importantbackport--rejoin

著者のブログ投稿に詳細な説明があります。

于 2012-01-18T06:09:06.560 に答える
1

異なるブランチでプッシュすることは、非常にトリッキーなことです。

おそらく最も簡単な方法は次のとおりです。

  1. サーバーから「重要な」レポをもう一度複製します。
  2. 「bigproject」で、最初にプッシュするつもりだった変更を正確に含むパッチを生成します (例: git format-patch) (元のコミットがファイルを混在させる場合は、最初にサイド ブランチで「より小さな」コミットを行う必要がある場合があります)プッシュする必要があるファイルと、プッシュしてはならないファイル)
  3. 「重要」の新しいクローンにパッチを適用します(git am)
  4. 「important」の新しいクローンをデフォルトのリモート マスターにプッシュします。これで、プッシュは単純な早送りになり、問題が発生することはありません。
于 2011-08-10T14:28:58.310 に答える