web-dev-qa-db-ja.com

履歴を維持しながら、Gitリポジトリから新しいリポジトリに単一のディレクトリを移動するにはどうすればよいですか?

別のディレクトリに複数のプロジェクトを含むgitリポジトリを継承しました。リポジトリをプロジェクトごとに新しい個別のリポジトリに分割し、マスターリポジトリにプロジェクトをサブモジュールとして含めるようにします。可能であれば、個々のプロジェクトの改訂履歴を維持しながら、これらすべてを実行したいと思います。

各プロジェクトのリポジトリを複製し、毎回他のすべてのプロジェクトを削除することもできますが、新しいプロジェクトリポジトリごとに複製された履歴を保持するより良い方法はありますか?

109
cidered

git filter-branch プロジェクトの履歴を書き換えます。ドキュメントから:

Foodir /がプロジェクトルートであるかのようにリポジトリを書き換え、他のすべての履歴を破棄するには:

git filter-branch --subdirectory-filter foodir -- --all

リポジトリのコピーをいくつか作成し、分割したいサブディレクトリごとにコピーを行います。探しているものを見つける必要があります。

98
Brian Campbell

フォルダを新しいリポジトリとしてエクスポートするには、次が必要です。

  1. エクスポートするフォルダがあるリポジトリを複製します。
  2. ホスティングプロバイダーでGitHubとして空のリポジトリを作成し、エクスポートされたフォルダーを保存します。
  3. 複製されたリポジトリフォルダーを開き、次のコマンドを実行します。

    git subtree Push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
    
3
user

Gitのポイントは、親コミットをハッシュすることにより、各コミットで履歴が具体化されることです。コミットを「リプレイ」して(これが基本的にsvn-importerの動作)、新しいリポジトリに入れて、各サブプロジェクトのみを保持することができます。ただし、これはコミットハッシュの意味を破壊します。それで問題がなければ、そうしてください。

過去に、私はそれを複製して先に進みました。これにより物事は大きくなりますが、ディスク容量は安価です。私の時間は高価です。

また、ディレクトリをスプライスするツールも知りません。ディレクトリのgit-logですべてのコミットを見つけてから、git-fast-exportのようなものでコミットを再生できると思いますか?

1
Colin Burnett