2011-08-10 11 views
4

私はサブツリーのようないくつかのディレクトリを持つ大きなメインプロジェクトを持っています。gitは別のメインリポジトリにサブディレクトリをプッシュ

私はしたい特定のサブツリーの1つの特定のサブツリーの変更を独立したリポジトリにプッシュします。

困っているようですが、それは現在のようですサブツリー元々リポジトリから来ていないので押してみたいプッシュしたいです。それはサブツリーガイドを介して別のレポから来ました。私はグーグルで見つけました。それはちょうど非常に似ています。

大きなプロジェクトレイアウト。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にimportant_subtreeをプッシュします。その後、~/devel/important/efg.txtにも変更があります。

私が行うために管理唯一のことは、私が欲しいものは明らかにされていない、重要bigprojectにプッシュにすべてをプッシュすることです。サブツリー内の変更のみをプッシュする必要があります。

答えて

2

これは複雑ではなくなりました。不要なサブディレクトリを取り除き、新しいリモートにプッシュするには、レポのクローンで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 . 
+0

魅力的な作品です。 'YOUR_SUBDIR'が書き換えられたリポジトリのルートディレクトリになります(これはまさに私が望むものです)。また、私は 'プッシュ'を理解していない:私の新しいリモートURL?なぜ-f(力)?何が "。"ここですか?私はあなたのプッシュを再現できませんでした。だから私は 'cd ..のために行った。 git clone ' - 完璧です。 – towi

+0

プッシュは、抽出されたファイルを新しいリモートに追加することです。編集がより明確ですか? – jeremyjjbrown

+0

"新しいリモート?私は、歴史が書き直されているので、書き換えられたレポを現在のリモートにプッシュできないと言っていると思います。ですから、新しいリポジトリを初期化して(サーバーの何でも)、書き換えをそこにプッシュするのが最善です。 – towi

1

異なるブランチを押すことは非常に難しいことです。

は多分最も簡単な方法は、次のようになります。

  1. クローンあなたの「重要」レポもう一度サーバーから。
  2. を最初に押し込むことを意図した変更が正確に含まれている "bigproject"プロダクトパッチ(例えばgit format-patch)(サイドブランチの "小さな"コミットを最初に行う必要があるかもしれません。オリジナルはコミットする必要のあるファイルやそのようなファイルをコミットする)
  3. "重要"の新しいクローンでは、パッチを適用する(git am)
  4. "重要"の新しいクローンをデフォルトのリモートマスターにプッシュする。今すぐプッシュは単純な早送りに過ぎず、トラブルを引き起こしません。
+0

<> thats私が考えたもの。ありがとうございました。 – towi

3

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

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

これだけimportant_subtree/を変更したものを取って、サブツリーとしてimportantを合併以来bigprojectの変化を桜は、選択されます。次に、~/devel/importantからインポートしたコミットの上に新しいコミットとして適用し、通常の方法で戻すことができるブランチbackportを作成します。また--rejoinを使用すると、将来的にコミットIDを使用する必要がなくなり、より多くの変更に対してプロセスを繰り返すことができます。

さらに詳しい説明はauthor's blog postです。

関連する問題