ネストされたGitリポジトリ?


181

Gitリポジトリをネストできますか?私が持っています:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

ローカルですべての管理を容易にすることは意味がgit init/addありますか、それともサードパーティを個別/project_rootに管理する必要がmy_projectありますか?

回答:


159

あなたはサブモジュールと呼ばれるGit機能を探しているかもしれません。この機能は、メインリポジトリ内にネストされている依存リポジトリの管理に役立ちます。


43
比較的gitの初心者として、私はこのブログ/チュートリアルがchrisjean.com/2009/04/20/…を理解するのがより簡単であることに気付きました。読みやすいと思いました。
John K

4
chrisjean.comブログは、フォローしようとしただけでは最新のブログではないようです。Gregのwiki投稿はもう少し複雑かもしれませんが、gitの初心者として、私は単純なものよりも正確を好んでいます...
sage

ブログは今は正常に動作しているようですが、残念ながら賢者にとって、コメントに対する34人(現在は35人)の賛成票は、ブログ記事に価値があることに同意しているようです。明快さと操作固有のアドバイスのために正確さを犠牲にする必要がないことがわかります。それを読んだ後、著者がすでに少し調べており、おそらくkernel.orgのWikiページだけでなく、実際のGitのドキュメントも読んでいたと思います。完全にコンテキスト化された例でのブログ作成者のGit指向の説明は、多数の個人にとって非常に役立つようです...
Matthew Weber

13
ところで、上記のクリスジャンリンクは死んでいます。更新されたリンクはchrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh

35

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

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

リポジトリをセグメント化する方法を決定する際に、通常、それらを変更する頻度に基づいて決定します。それがサードパーティのライブラリであり、それに対して行っている変更のみが新しいバージョンにアップグレードする場合は、メインプロジェクトから確実に分離する必要があります。


22

完全を期すために:

別の解決策があります。サブツリーのマージです。

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

$ 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を参照してください


gitブックへのサブツリーのマージ参照が機能しなくなりました。現在、これはリンクのように表示されます。git-scm.com/book/en/v2/...
ericx

18

追加できます

/project_root/third_party_git_repository_used_by_my_project

/project_root/.gitignore

ネストされたリポジトリが親リポジトリに含まれるのを防ぐ必要があり、それらを個別に操作できます。

ただし、ユーザーが親リポジトリでgit clean -dfxを実行すると、無視されたネストされたリポジトリが削除されます。別の方法は、フォルダーをシンボリックリンクし、シンボリックリンクを無視することです。次にgit cleanを実行すると、シンボリックリンクは削除されますが、「ネストされた」リポジトリは実際には他の場所にあるため、そのまま残ります。



5

概要。

gitリポジトリをネストできますか?

はい。ただし、デフォルトでは、gitは.gitネストされたリポジトリのフォルダーを追跡しません。Gitには、ネストされたリポジトリを管理するように設計された機能があります(以下を参照)。

ローカルですべての管理を容易にするためにgit init // project_rootを追加することは理にかなっていますか、それともmy_projectとサードパーティを個別に管理する必要がありますか?

gitにはネストされたリポジトリを管理する機能があるため、おそらく意味がありません。ネストされたリポジトリを管理するためのGitの組み込み機能はsubmodule、およびsubtreeです。

ここにあるトピックに関するブログは、ここでSOの質問それぞれを使用しての長所と短所をカバーしています。


2

プロジェクトごとに1つのリポジトリを使用します。こうすることで、履歴を閲覧しやすくなります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.