この質問は多くのポーズに似ていますが、不愉快に違います。以前に結合されたコードを複数のgitリポジトリに分割する
私はgvリポジトリを持っていました。これはかつてはCVSリポジトリでした(CVSリポジトリでした)。これには1999年頃までのデータが含まれています。
この1つのリポジトリをいくつかの異なるリポジトリに分割し、この豊富な履歴をすべて保存する時が来ています。しかし、リポジトリの構造は頻繁に変更されています。すべての現在のプロジェクトは基本プロジェクトからのもので、いくつかのプロジェクトに成長し、2つのプロジェクトに縮小してから再び成長しました。コードは移動しましたが、複製されませんでした。成熟したいくつかのプロジェクトのうちのひとつで、最終的な休息場所を見つけました。
これは、履歴を保存したい場合、リポジトリを非常に分割することになります。 git-filter-branchを使うのは適切なアプローチのようですが、これらのすべてがリポジトリの一部をハックして履歴を切り捨てるようです。
EDIT追加明確にするために、私がリポジトリのルートにいるような小さな例があります。リポジトリが次のようになっているとします:file.txt
の内容を編集してみましょう。その後、名前をnewfile.txt
に変更します。次に、内容を再度編集します。次に、このファイルをbar/
からbaz/
に移動します。私のリポジトリには、次のようになります。
foo/
bar/
baz/
newfile.txt
[OK]を、今の私は、独自のリポジトリに出baz/
を分割したいとしましょう。 git filter-branchまたはgit subtree splitを使用すると、bar/
の中にあったときに、そしてfile.txt
と命名されたときに、コミットメッセージと履歴がすべてnewfile.txt
に戻ってしまいます。
私は、過去のリビジョンをチェックアウトするのは狂っているかもしれないことを理解しています。それは../bar/
と呼ばれるものを参照しているかもしれないし、存在しないし、壮大に失敗する無効なディレクトリを参照しているかもしれません。特定のリビジョンでファイルの内容を見ることができる限り、私は気にしません。
のEND EDIT
私がやりたいことのための2つの経路があるように思える:
クローンリポジトリN回はそのリポジトリに私がしたいフォルダを保存し、(経由git rm-ing他のフォルダ)、HEADにあるファイルを最終的に参照しないリビジョンを何らかの形でハックします。私はこれがいくつかの否定的な副作用を持っていることを理解しています。古いリビジョンをチェックすることは意味のあるコードベースを提供しません - 私は気にしません。これを行うには、HEADに存在するすべてのファイルの下にあるすべてのパスを取得する方法を見つける必要があります。これは醜いスクリプトで行うことができます。
各インデックス中にリポジトリの外観の履歴インデックスを作成します。ツリーフィルタを使用して、それぞれのリビジョンで一致しないファイルを切り落とします。次に、表示されないファイル、またはHEAD内のファイルから削除するファイルを削除します。
HEADに表示されないすべてのファイルを検索し、それに関する履歴を削除することはできますか?私は長い間削除されたファイルを復活させることには気をつけません。これは私の問題の要点であるようです。
代替の解決策も認められます。私はgitには比較的新しいので、私はおそらく明らかに何かを欠いているでしょう。
hmm。それは私が必要なもののように見えます。私はそれを試してみましょう。 – lucasmo
これは残念なことに、私が必要としていることをしていないようです。私はその事例をさらに例として明確にします。 – lucasmo