31

私はこのGitリポジトリを持っています。これには2つのフォルダが含まれています:binary-searchpoker

例:https ://github.com/soulnafein/code-katas

これらのフォルダをサブモジュールに変換し、変更履歴を保持したいと思います。

どうやってやるの?

4

2 に答える 2

15

今日、これを行うためのより良い方法があります:git subtree

この回答を参照してください。

于 2012-05-14T11:36:58.080 に答える
13

一般的な考え方は、「gitfilter-branch」と次の手順を使用することです。

1)(リポジトリのクローンを作成した後)の--subdirectory-filterを使用してサブモジュールを作成しfilter-branchます。

$ git filter-branch --subdirectory-filter ABC HEAD -- --all

このステップの詳細については、このSOの質問を参照してください。

2)のインデックスフィルターを使用してスーパープロジェクトを作成しfilter-branch、サブモジュールを削除します。

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD

3)サブモジュールを最新バージョンのスーパープロジェクトにコミットします。

実用的な例については、サブディレクトリを別のgitリポジトリにデタッチするを参照してください。

各サブモジュールはその履歴を保持します。
しかし、このパッチ提案で述べたように、それは次のようになります。

スーパープロジェクトとサブモジュールの間のすべての履歴接続が失われ、' git bisect'などのツールが壊れ、古いリリースの回復が困難になります。

理想的には、新しく作成されたスーパープロジェクトの各バージョンは、サブモジュールの正しいバージョンにリンクされます(そして、プロジェクトの履歴全体で、すべての.gitmodulesエントリも正しく設定されます)

以前の履歴を新しいサブモジュールにリンクする必要がない場合は、上記の手順に従うことができます。
ただし、サブモジュール(現在は単純なサブディレクトリ)への参照があるときに古いポイントから分岐する必要がある場合は、私が参照しているパッチに記載されているスクリプトを試すことを検討できます。このスレッドで説明されていますが、Junio C Hamanoが言うように、まだGitに統合されています。

残念ながら、スーパープロジェクトツリー内で同じサブモジュールが移動するさまざまな履歴ポイントをチェックするための動作を完全に(またはまったく実装して)設計していないと思います。

于 2009-10-20T10:46:27.170 に答える