別々のディレクトリに複数のプロジェクトを含むgitリポジトリを継承しました。リポジトリをプロジェクトごとに1つずつ、新しい個別のリポジトリに分割し、マスターリポジトリにプロジェクトをサブモジュールとして含めます。できれば、個々のプロジェクトの変更履歴を維持しながら、これらすべてを実行したいと思います。
各プロジェクトのリポジトリを複製し、他のすべてのプロジェクトを毎回削除することはできますが、新しいプロジェクトリポジトリごとに履歴を複製しないようにするためのより良い方法はありますか?
別々のディレクトリに複数のプロジェクトを含むgitリポジトリを継承しました。リポジトリをプロジェクトごとに1つずつ、新しい個別のリポジトリに分割し、マスターリポジトリにプロジェクトをサブモジュールとして含めます。できれば、個々のプロジェクトの変更履歴を維持しながら、これらすべてを実行したいと思います。
各プロジェクトのリポジトリを複製し、他のすべてのプロジェクトを毎回削除することはできますが、新しいプロジェクトリポジトリごとに履歴を複製しないようにするためのより良い方法はありますか?
回答:
を使用git filter-branch
して、プロジェクトの履歴を書き換えることができます。ドキュメントから:
リポジトリを書き直して、foodir /がプロジェクトルートであるかのように見せ、他のすべての履歴を破棄します。
git filter-branch --subdirectory-filter foodir -- --all
リポジトリのコピーをいくつか作成し、分割するサブディレクトリごとにそれを実行します。探しているものを探し出す必要があります。
--subdirectory-filter
複数回指定する必要があります。EG git filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
など--subdirectory
は複数のディレクトリを使用しませんが、複数回指定できます。
foodir
書き直さずに元のプロジェクトで保持したい場合は、それでgit rm -r foodir
十分です(作業ツリーのコピーも削除されます。不要な場合は、を使用してください--cached
)。履歴から完全に削除したい場合(@iliusの質問にも答えます)、次のようなものが必要ですgit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
ため--tree-filter
、ソリューションはよりも高速で、インデックスを直接操作するだけで済みます。--tree-filter
あなたではなく、インデックス操作オペレーションで動作するようになるよりも、普通のfilsystem操作を使用することができますように、しかし使用することを少し簡単にすることができます。
フォルダを新しいリポジトリとしてエクスポートするには、次のものが必要です。
複製されたリポジトリフォルダーを開き、次のコマンドを実行します。
git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
git subtree
Cygwinパッケージとしては使用できません。必要な場合:stackoverflow.com/a/27116828/2484903
gitのポイントは、親コミットをハッシュすることにより、履歴が各コミットに組み込まれることです。コミット(これは基本的にはsvn-importerが機能する方法です)を新しいリポジトリに「リプレイ」し、各サブプロジェクトのみを保持することができます。しかし、これはコミットハッシュの意味を破壊します。あなたがそれで問題がないなら、そうそれです。
過去に、私はそれを複製して先に進みました。これは物事を大きくしますが、ディスク容量は安価です。私の時間は高いです。
また、ディレクトリをスプライスするツールも知りません。ディレクトリでgit-logを実行してすべてのコミットを検索し、git-fast-exportのようなものでコミットを再生できると思いますか?