2010-12-27 21 views
4

私たちの小チームは、プロジェクトAのライブラリ(X、Y、Z)がgitサブモジュールに分かれていれば、すばらしいアイデアだと思っていました。プロジェクトがまだ初期段階にあり、まだ十分に分離されていないため、これがどれほど大きな痛みであるかはわかりませんでした。 I プロジェクトリーダーがサブディレクトリをgit filter-branchコマンドでサブモジュール化しました。(私は彼に休暇中ですか?)gitでサブモジュールを元に戻す?

これをどうにか元に戻して、サブモジュールのコミットをメインプロジェクトに戻すことはできますか? '痛み' の

例:私たちは、ユーザーができるようにしたい場合:代わりに '// SSH' のリンク:

  • プロジェクトAは、 '// gitの' を介してX、Y、Zを指している必要がありますsshアクセスなしでチェックアウトしてください。プッシュできるようにするには、A/Xコピーを使ってXに直接変更することはできません。別にクローンを作成し、コミットし、プッシュしてからA/Xコピー。
  • さらに、TortoiseGitや他のウィンドウツールはサブモジュールを理解していないようです。少なくともクローンとして透過的にならないので、今は愚かなスクリプトやフックでパッチを貼ります。
  • ああ、X、Y、またはZの変更ごとに、メインプロジェクトに「サブモジュール更新」コミットを追加する必要があります。私はサブモジュールが、異なるチームによって維持されているはるかに成熟したプロジェクトのためのものであったと推測しています。
+0

私はgitのの1つのバージョンでは 'フィルタ-branch'を見つけられませんでした(どちらのジョナサン・レフラーは、彼のコメントで、私は大きな問題もなくサブモジュールを使用するいくつかのプロジェクトに取り組むために言及している。その理由のために)私は 'git submodule'を見つけました - http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#submodulesを見てください。もう一度見て、私はfilter-branchを見つけましたが、私はサブモジュールがより適切であると思います。 –

+2

分離を元に戻すと、プロジェクトリーダーが幸せになろうとしていますか? –

+0

注目すべきプロジェクトにはライブラリも分割されています(例: Netfilter。 – user502515

答えて

1

すべてのリポジトリを単一のものに簡単にマージすることができます。マージするために共通のものは必要ありません。ファイルの競合を防ぐだけです。したがって、最初に別々のリポジトリ内のすべてのファイルを目的のフォルダに移動します。ここでは、これらの別々のリポジトリをマージするだけです。

+1

これは履歴を失い、それはおそらく望ましくないでしょう。 – siride

+0

この場合、git mergeが履歴を失うのはなぜですか? –

1

プロジェクトAは、ユーザーがsshアクセスなしでチェックアウトできるようにするには、 'ssh://'の代わりに 'git://'リンクを使用してX、Y、Zをポイントする必要があります。プッシュできるようにするには、A/Xコピーを介してXに直接変更します。別にクローンを作成し、コミットし、プッシュしてから、A/Xコピーから引き出す必要があります。

あなたが望むように、すべてのX、Yの変化、またはZのために私たちはメインプロジェクトにコミット「更新サブモジュール」を追加する必要がありyeah--ああ...

 
[remote "origin"] 
     url = git://foobar 
     pushurl = ssh://[email protected]/srv/git/foobar 

サウンズ。

サブモジュールはスキップリストのように機能するので、これは予想されます。気に入らない場合は、サブプロジェクト内のコミットが完了するたびにサーバー側のフックを使用してメインプロジェクトを更新することを検討してください。

2

私は必ずしもこれを推奨するわけではありませんが、私は同じ名前のサブディレクトリとして各サブモジュールを削除してからマージするスクリプト(unsubmodule.py)を作成しました。各サブモジュールのコミットさバージョンの:

https://gist.github.com/763439

私はそれがはるかに、そう、例えば気をつけてくださいテストしていません

最初は新しいクローンで試してみてください。スクリプトは、スーパーモジュールでコミットされたバージョンだけで、サブモジュール内のトピックブランチを保持しようとしません。

+0

ここに関連する質問があります:http://stackoverflow.com/questions/1759587/un-submodule-a-git-submoduleここで一番上の答えは私のスクリプトと同様の手順を示していますが、その場合はちょうど単一サブモジュールの場合私のスクリプトはより安全だと思います。既存のサブモジュールを移動するだけで、サブモジュールの.gitディレクトリ内のトピックブランチやその他の情報を失うことはありません。 git logの-Cや-Mに関するその答えのコメントはここでも当てはまります。 –