2012-09-25 12 views
6

私の質問Git subtree export and re-import woesの後、私はどのようにフォルダをサブツリーに変換するのか尋ねたがっています。既存のフォルダをgitサブツリーにする

私は現在、別のプロジェクト(と多分)と共有されるはずのコードを持っているリポジトリAを持っているので、すべての共有コードをフォルダ "sub"に入れます。可能であれば、このフォルダをリポジトリCに展開する必要があります。その後、 "sub"はCのサブツリーになりますが、Aの履歴を失うことはありません(非常に重要です)。また、「サブ」を変更してCに戻すこともできます。

答えて

7

git subtree splitと同じです。 --prefixのフォルダを指定すると、リポジトリ内の別のツリーが生成され、別のリポジトリにプッシュして適切に使用することができます。

のgitの現在のバージョン(1.8.1)は、サブツリーのドキュメントが含まれていませんが、あなたはそれをここに見つけることができます:あなたが使用することができhttps://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt

フローは次のとおりです。

# In Repo A create your subtree split and push it 
> git subtree split --prefix sub --branch subBranch 
> git push C subBranch:master 

# After some changes that touched the sub directory 
> git subtree push --prefix sub C master 

最後のコマンドウィルツリーを再分割し(Cのツリーの完全性を維持するために以前に分割されたコミットを使用して)、C/masterにプッシュします。

あなたはコンテンツに歴史を削除する場合git splitが-ingとgit push -ingときに--squashオプションを使用することができますCにプッシュ。一貫性を保ち、それを前もって使用し続ける必要があります。押しつぶされたコンテンツと非押し潰されたコンテンツを混在させ始めると、サブツリーは適切に分割してプレビオスの分割を再利用することができなくなるため、Cにプッシュすることはできません。

最後に、subの最初の分割を作成すると、それを削除して新しいサブツリーとして再度インポートする必要はありません。あなたがそれを持っていれば、git subtreeは他の分割から以前に作成されたコミットを再生成/再利用します。フォルダを削除してから、作成したコミットからsubを再度追加すると、それでも正常に動作するはずです。--squashを使用している場合は、Cには履歴はありませんが、Aの履歴を保持します。

関連する問題