2017-09-19 3 views
0

すべてのデータが格納された1つの大きなGITプロジェクトがあります。 少し前に、私たちはそれらを分割することに決めました。今度は、1つではなく10つのプロジェクトがあります。 残念ながら、それぞれの履歴を持つオブジェクトを移行していませんでした。つまり、新しいプロジェクトのオブジェクトの履歴はゼロから始まり、古い履歴は以前の "大きな"プロジェクトのままです。ファイルが既に分割されているときにGITオブジェクト履歴をマージする

私はちょうど履歴と残りのファイルをgit bundleでかなりうまくいきました。 しかし、これは履歴全体を格納しています。 プロジェクト内のオブジェクト/アイテムごとに履歴をバックアップ/復元/マージすることはどういうことですか?

+0

それぞれの新しいレポに、引用文献の第二セットの後ろに「古い歴史を」残すことができますか? – Jens

+0

https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository –

答えて

0

あなたがしたいことは可能です。それは多少関わっているかもしれません。以下では、履歴リポジトリRepo0を参照し、10個の新しいリポジトリ(Repo1、Repo2、...)に移行します。

コミット、gitの中で新しい歴史

を作成するには、多かれ少なかれ原子です。あなたは本当に "バンドルを作成し、これらのパスのみを含める"とかそんなものを言うことはできません。代わりに、部分プロジェクトごとに「新しい履歴」を作成する必要があります。これはfilter-branchを使用して行うことができます。

もちろん、分かりやすいブランチがあれば簡単ですが、Repo0には任意のプロジェクトに関連するブランチのセットがあるとしましょう。 masterおよびdevRepo1の関連性のある歴史が含まれているとします。

のでRepo0に、あなたは今、あなたは一人でRepo1に関連する歴史の中に「大きな歴史」を変換する、新しい枝をフィルタリングし、新たな支店に

git branch Repo1/master master 
git branch Repo1/dev dev 

を作成することによって開始します。 Repo1Repo0のサブディレクトリに対応する場合、これは簡単です。物事は、その後、あなただけsubdirectory-filterをシンプルな使用することをしているのであれば、最良の場合Repo0

Project1-Files/ 
    some.file 
    test/ 
    test.file 
Project2-files/ 
    another.file 
    ... 

Repo1のように見えるが

some.file 
test/ 
    test.file 

で終わるでしょう。

git filter-branch subdirectory-filter Project1-Files --prune-empty -- Repo1/master Repo1/dev 

さらに整理が必要な場合は、tree-filterを使用する必要があります。 my-filter.sh

git filter-branch tree-filter my-filter.sh --prune-empty -- Repo1/master Repo1/dev 

Repo1の正しい構造にRepo0からworktreeを変換するスクリプトです。これはsubdirectory-filterよりも多くのリソースを消費します。

妥協はindex-filterを使用することです。実際に複雑にしたい場合は、正確にtree-filterより速くすることができます。構文はtree-filterと同じですが、フィルタスクリプトは作業ツリーではなくインデックスで直接操作する必要があります。したがって、「単純な」妥協案は、無関係なファイルをすべて削除することですが、関連するファイルはディレクトリ構造のどこに残しておきます。したがって、あなたの履歴には、履歴が一緒につながっているような、偽の「ファイル移動」があるかもしれません。

とにかくこれが正常に実行されると、Repo1/masterRepo1/devにはRepo1に適した新しい履歴が含まれます。 (masterdevはまだ「大きなプロジェクト」の歴史となり、あなたはお互いレポの新しい歴史を構築するための出発点として、それに戻って行くよ。)

次はあなたがRepo1に新しい歴史を移します。あなたはバンドル(Repo1/masterRepo1/devを含む)でこれを行うこともできますし、直接そのようにRepo1にリモートとしてRepo0を追加し、ちょうどfetchレフリーことができます。

最後に、あなたが移行し、「古い歴史」にRepo1ですでにだ「最近の歴史を」グラフトでしょう。これには2つの一般的なアプローチがあります。

一つの方法は、物理的に再びfilter-branchを使用することになり歴史を書き換えることです。これにはいくつかのバリエーションがありますが、基本的にはfilter-branch--parent-filterの仕組みを見てください。これにより、最もシームレスな履歴が作成されますが、各コミットのIDはRepo1に変更されます。ので、私のアドバイスは、あなたがRepo1起源に変換を行い、その後、誰もが再クローンを、誰もが自分のRepo1変更をプッシュし、そのクローンを捨て、「ハードカットオーバー」を行うことです。

ハードカットオーバーを調整できない場合や、何らかの理由で古いコミットIDを失うことができない場合は、git replaceを使用してヒストリーブレークを記録することを検討してください。一部の癖や制限があるため、git replaceドキュメントをご覧ください。

またはコースのあなただけの古い歴史の上にあなたの枝をリベースしようとしたことがあり

関連する問題