Gitリポジトリの部分だけをチェックアウトするにはどうすればよいですか?複数のモジュールを含むリポジトリがあり、特定のサイトにモジュールの1つだけをインストールしたい。
Subversionでは、svn export http://example.com/repository/path/to/module ./module-name
。
@Chrisが述べたように、Gitの現在のバージョンはスパースチェックアウトをサポートしています。
指定されたディレクトリのみを含むようにローカルリポジトリを変換するには:
cd <repo/location>
git config core.sparsecheckout true
echo desiredDir/ >> .git/info/sparse-checkout # repeat to add multiple subdirs (the rest will be removed)
ここで、指定されたディレクトリ以外のすべてを削除するには、次のようにします。
git read-tree -mu HEAD # remove all, but those in .git/info/sparse-checkout
svn exportに最も近いものは git archiveだと思います-) 。あなたはディレクトリを引っ張ることができますpath/to/module
リポジトリのmasterブランチから、ローカルディレクトリに配置しますmodule-name
このような:
git archive --remote=url-of-Git-repository --prefix=module-name/ master:path/to/module |
tar xf -
リモートサーバーがアーカイブをサポートしていない場合は、ローカル(ベア)クローンからアーカイブをプルします(ベアクローンを使用すると、重要な場合は、ローカルリポジトリにファイルの別のコピーを作成できなくなります)。
ただし、「チェックアウト」の使用は、(私にとって)一部のファイルのみが存在する機能的なGitワークツリーが必要であることを意味します。これは、Git1.7.0で導入された「スパースチェックアウト」機能を使用して実現できます。
この機能を有効にするには
リポジトリごとの入力$GIT_DIR/info/sparse-checkout
保持するパス名のパターンを含むファイル****。
インデックスで低レベルの「スキップワークツリービット」を使用する場合があります*** 個々のファイルのまばらさを管理しますが、代わりに高レベルのメカニズムを使用する方がおそらく簡単です。
ユーザーインターフェイス全体にいくつかのギャップがあります(つまり、「このURLでリポジトリのクローンを作成し、X、Y、Zのみをチェックアウトする」と言う簡単な方法はありません)が、「部分的なチェックアウト」機能を取得するには十分なはずです。
*git configマンページ の「core.sparseCheckout」を参照してください。
****git read-treeマンページ の「スパースチェックアウト」を参照してください。
***git update-indexmanpage の「Skip-worktreebit」を参照してください。
いいえ、それはGitでは不可能です。
このようなものをGitに実装することはかなりの労力であり、クライアント側リポジトリの整合性が保証されなくなることを意味します。興味がある場合は、gitメーリングリストで「スパースクローン」と「スパースフェッチ」に関するディスカッションを検索してください。