2009-12-09 5 views
139

gitリポジトリをネストすることはできますか?私が持っている:ネストされたgitリポジトリ?

/project_root/ 
/project_root/my_project 
/project_root/third_party_git_repository_used_by_my_project 

それは、initは/ローカルのすべての管理を容易にするために/ PROJECT_ROOTを追加したり、私は別にMY_PROJECTおよびサードパーティの1を管理しなければならないのgitのために理にかなっていますか?

答えて

124

submodulesというGit機能を探しているかもしれません。この機能は、メインリポジトリ内にネストされた依存リポジトリを管理するのに役立ちます。

+29

相対的な初心者として、私はこのブログ/チュートリアルを理解しやすくなりました。http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/もっと簡単ですヘルパーシェルスクリプトのコンテキストを持つ代わりにgitだけに焦点を当てるアプローチ。私はそれを読むのが簡単だと分かった。 –

+2

chrisjean.comブログはちょうどそれに従おうとしたことに基づいて現在のようではないようです。 Gregのwiki投稿はもう少し複雑かもしれませんが、git初心者の方は私は単純な方が正確です。 – sage

3

プロジェクトごとに1つのリポジトリを使用します。そうすれば、履歴をブラウズするのが容易になります。

私が使用しているサードパーティライブラリのバージョンを、それを使用しているプロジェクトのリポジトリにもチェックします。

34

サードパーティのライブラリを別のリポジトリに配置し、サブモジュールを使用してそれらをメインプロジェクトに関連付けます。

http://git-scm.com/book/en/Git-Tools-Submodules

どのセグメント私は通常、私はそれらを変更する方法をしばしばに基づいて決めるだろうレポをすることを決定するには:ここでウォークスルーがあります。サードパーティ製のライブラリで、変更のみを新しいバージョンにアップグレードする場合は、それをメインプロジェクトから確実に分離する必要があります。

14

git-subtreeは、単一のツリー内で複数のプロジェクトを扱うのに役立ちます。およびは、分離可能な履歴を保持します。ただ、完全性について

+3

この機能はGitに統合されました。ここに素敵な説明があります:https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree – nobar

16

:別の解決策はあり

、私が推薦する:subtree merging

サブモジュールとは対照的に、メンテナンスは簡単です。 通常の方法で各リポジトリを作成します。 メインリポジトリで、メインディレクトリのディレクトリにある別のリポジトリのマスタ(または他のブランチ)をマージします。

$ git remote add -f OtherRepository /path/to/that/repo 
$ git merge -s ours --no-commit OtherRepository/master 
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master 
$ git commit -m "Merge OtherRepository project as our subdirectory"` 

そして、(それを更新するために)あなたのディレクトリに他のリポジトリを引くサブツリーマージ戦略を使用するためには:

$ git pull -s subtree OtherRepository master 

私はここ数年のために、この方法を使用していますが、それは動作します:-)

サブモジュールとの比較を含め、この方法については、このgit howto docに記載されています。

+0

git bookへのサブツリーマージ参照が機能しなくなりました。現在、これはリンクのようです:https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_subtree_merge – ericx

11

あなたは、親レポに含まれるネストされたレポを防止しなければならない、とあなたが独立して彼らと一緒に作業することができ

/project_root/.gitignore 

/project_root/third_party_git_repository_used_by_my_project 

を追加することができます。

ただし、ユーザーが親リポジトリ内でgit clean -dfxを実行すると、無視されたネストされたリポジトリが削除されます。もう一つの方法は、フォルダをシンボリックリンクし、シンボリックリンクを無視することです。git cleanを実行すると、シンボリックリンクは削除されますが、実際には他の場所にあるので、 '入れ子にされた'リポジトリは元のままです。

関連する問題