171

Git でリポジトリのサブディレクトリをチェックアウトすることはできますか?

新しい WordPress インストールをセットアップしていると想像してください。プラグインとテーマのカスタマイズ用に 2 つの新しいディレクトリを作成します。

  • wordpress/wp-content/plugins/myplugins/
  • wordpress/wp-content/themes/mytheme/

これらのディレクトリを Git 経由で維持したいと考えています。Subversion では、ディレクトリとサブディレクトリをチェックアウトすることでこれを実現しtrunk/myplugins/ますtrunk/mytheme/。Git には、単一のリポジトリを使用して同じタスクを達成する方法がありますか?

私は、Git にほとんど触れていない長年の SVN ユーザーとして、Git パラダイムのボートを逃している可能性があります。

編集:異なるコンテンツを格納する 複数のブランチは、これを処理する興味深い方法です。

4

9 に答える 9

127

スパース チェックアウトGit 1.7 になりました。

「<a href="https://stackoverflow.com/q/4114887/578288">最初にリポジトリ全体をチェックアウトせずにスパース チェックアウトを行うことは可能ですか?」という質問も参照してください。

スパース チェックアウトでは、Git がダウンロードするファイルの一部が作業ツリーに収まらない場合でも、リポジトリ全体をダウンロードする必要があることに注意してください。

于 2010-02-20T20:40:42.140 に答える
17

git でそれを行う実際の方法はありません。また、単一の作業単位として一度に両方のツリーに影響を与える変更を加えないのであれば、両方に対して単一のリポジトリを使用する正当な理由はありません。私はこの Subversion 機能が恋しいと思っていましたが、リポジトリを作成することによる管理上の精神的オーバーヘッドがほとんどないことがわかりました (単純に、作業コピーの外側の場所を明示的に選択する必要がなく、作業コピーのすぐ隣にリポジトリが格納されているという事実が原因です)。作業コピー) で、小さな単一目的のリポジトリをたくさん作成することに慣れました。

ただし、どうしても必要な場合は (または本当に必要な場合)、ディレクトリとディレクトリだけで git リポジトリを作成しmythememypluginsWordPress インストール内からそれらをシンボリック リンクすることができます。


MDCore は次のように書いています。

たとえば、mythemeにコミットすると、 mypluginのリビジョン番号が増加します

両方のディレクトリを単一のリポジトリに配置することにした場合、これは git にとって問題ではないことに注意してください。git は、任意の形式のリビジョン番号を単調に増加させるという概念を完全に排除するためです。

git の単一のリポジトリに何をまとめるかの唯一の基準は、それが単一のユニットを構成しているかどうかです。あなたの場合、各ディレクトリの編集を個別に見ることが意味をなさない変更があるかどうか。一度に両方のディレクトリのファイルを編集する必要がある変更があり、編集が一緒に属している場合、それらは 1 つのリポジトリにする必要があります。そうでない場合は、それらを一緒にグロムしないでください。

Git は、エンティティごとに個別のリポジトリを使用することを本当に望んでいます。

サブモジュール

サブモジュールは、両方のディレクトリを 1 つのリポジトリに保持したいという要望には対応しません。実際には、ディレクトリごとに個別のリポジトリを作成し、サブモジュールを使用して別のリポジトリにまとめる必要があるからですさらに悪いことに、WordPress インストール内のディレクトリは同じディレクトリの直接のサブディレクトリではなく、他の多くのファイルを含む階層の一部でもあるため、ディレクトリごとのリポジトリを統合リポジトリのサブモジュールとして使用しても何のメリットもありません。リポジトリはユースケース/ニーズを反映しません。

于 2008-10-07T20:06:48.607 に答える
16

まばらなチェックアウトについて私が気に入らないことの 1 つは、数ディレクトリの深さのサブディレクトリをチェックアウトする場合、ディレクトリ構造にそこにつながるすべてのディレクトリが含まれている必要があることです。

これを回避するには、自分のワークスペースではない場所にリポジトリを複製し、ワークスペース ディレクトリにリポジトリのサブディレクトリへのシンボリック リンクを作成します。git status のようなものは、現在の作業ディレクトリに関連する変更ファイルを表示するため、Git はこのように非常にうまく機能します。

于 2011-03-22T16:33:00.960 に答える
9

実際、「狭い」、「部分的」、または「まばらな」チェックアウトは、現在、Git 向けに大規模に開発されています。の下に完全なリポジトリがまだあることに注意してください.git。したがって、他の 2 つの投稿は Git の現在の状態に関するものですが、最終的にはスパースチェックアウトを実行できるようになるようです。 詳細に興味がある場合は、メーリング リストをチェックしてください。メーリング リストは急速に変化しています。

于 2008-10-08T20:17:41.377 に答える
1

編集が指摘しているように、2 つの別個のブランチを使用して、2 つの別個のディレクトリを格納できます。これにより、両方が同じリポジトリに保持されますが、両方のディレクトリ ツリーにまたがるコミットを行うことはできません。一方の変更が他方の変更を必要とする場合、それらを 2 つの別々のコミットとして実行する必要があり、2 つのディレクトリのチェックアウトのペアが同期しなくなる可能性があります。

ディレクトリのペアを 1 つのユニットとして扱いたい場合は、リポジトリのルートとして「wordpress/wp-content」を使用し、最上位で .gitignore ファイルを使用して、対象の 2 つのサブディレクトリ以外のすべてを無視することができます。これはおそらく、現時点で最も合理的な解決策です。

スパース チェックアウトは 2 年前から行われていると言われていますが、git 開発リポジトリにはまだその兆候はなく、必要な変更がそこに届くという兆候もありません。私はそれらを当てにしないでしょう。

于 2010-01-16T03:13:16.410 に答える
1

Subversion の無数の .svn ディレクトリではなく、プロジェクトのルートにある単一の .git フォルダーによってリポジトリ全体が処理されるため、リポジトリの単一のディレクトリをチェックアウトすることはできません。

単一のリポジトリでプラグインを操作する際の問題は、たとえばmythemeにコミットするとmypluginのリビジョン番号が増加することです。そのため、subversion でも別のリポジトリを使用することをお勧めします。

サブプロジェクトのサブバージョン パラダイムはsvn:externalsで、これは git のサブモジュールにいくらか変換されます (ただし、以前に svn:externals を使用したことがある場合は正確ではありません)。

于 2008-10-07T20:20:30.703 に答える