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


110

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

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


2
git-submodulesタグを追加しました。これは、リポジトリの一部をサブモジュールに変換するのに非常に役立つためです。
idbrii

回答:


99

を使用git filter-branchして、プロジェクトの履歴を書き換えることができます。ドキュメントから:

リポジトリを書き直して、foodir /がプロジェクトルートであるかのように見せ、他のすべての履歴を破棄します。

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

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


1
foodir を除外し、その履歴をすべて削除したい場合はどうなりますか?
saeedgnu 2013

1
注:複数のディレクトリが必要な場合は、--subdirectory-filter複数回指定する必要があります。EG git filter-branch --subdirectory-filter foodir --subdirectory-filter bardirなど--subdirectoryは複数のディレクトリを使用しませんが、複数回指定できます。
EnabrenTane 2013

3
@Adam履歴をfoodir書き直さずに元のプロジェクトで保持したい場合は、それでgit rm -r foodir十分です(作業ツリーのコピーも削除されます。不要な場合は、を使用してください--cached)。履歴から完全に削除したい場合(@iliusの質問にも答えます)、次のようなものが必要ですgit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
Brian Campbell

2
@ilius申し訳ありませんが、先に質問を逃しました。ディレクトリとその履歴を削除する方法については、上記の返信を参照してください。
ブライアンキャンベル

2
@iliusうん、それもうまくいく。大規模なプロジェクトでは、実際にファイルをチェックアウトする必要がない--index-filterため--tree-filter、ソリューションはよりも高速で、インデックスを直接操作するだけで済みます。--tree-filterあなたではなく、インデックス操作オペレーションで動作するようになるよりも、普通のfilsystem操作を使用することができますように、しかし使用することを少し簡単にすることができます。
ブライアンキャンベル

4

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

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

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
    

1
git subtreeCygwinパッケージとしては使用できません。必要な場合:stackoverflow.com/a/27116828/2484903
Jack Miller

2

gitのポイントは、親コミットをハッシュすることにより、履歴が各コミットに組み込まれることです。コミット(これは基本的にはsvn-importerが機能する方法です)を新しいリポジトリに「リプレイ」し、各サブプロジェクトのみを保持することができます。しかし、これはコミットハッシュの意味を破壊します。あなたがそれで問題がないなら、そうそれです。

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

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


私は賛成票を投じたのは、否定的であるに値しなかったからです-私は確かにこのアプローチに従わないでしょうが、彼が試みていたことがわかります
Alvin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.