web-dev-qa-db-ja.com

gitリポジトリの一部をチェックアウトする

Gitリポジトリの部分だけをチェックアウトするにはどうすればよいですか?複数のモジュールを含むリポジトリがあり、特定のサイトにモジュールの1つだけをインストールしたい。

Subversionでは、svn export http://example.com/repository/path/to/module ./module-name

8
ceejayoz

@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
4
Brent Faust

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で導入された「スパースチェックアウト」機能を使用して実現できます。

この機能を有効にするには

  1. core.sparseCheckout構成オプションを「true」に設定する*、および
  2. リポジトリごとの入力$GIT_DIR/info/sparse-checkout保持するパス名のパターンを含むファイル****

    インデックスで低レベルの「スキップワークツリービット」を使用する場合があります*** 個々のファイルのまばらさを管理しますが、代わりに高レベルのメカニズムを使用する方がおそらく簡単です。

ユーザーインターフェイス全体にいくつかのギャップがあります(つまり、「このURLでリポジトリのクローンを作成し、X、Y、Zのみをチェックアウトする」と言う簡単な方法はありません)が、「部分的なチェックアウト」機能を取得するには十分なはずです。

*git configマンページ の「core.sparseCheckout」を参照してください。
****git read-treeマンページ の「スパースチェックアウト」を参照してください。
***git update-indexmanpage の「Skip-worktreebit」を参照してください。

2
Chris Johnsen

https://stackoverflow.com/questions/600079/is-there-any-way-to-clone-a-git-repositorys-sub-directory-only

いいえ、それはGitでは不可能です。

このようなものをGitに実装することはかなりの労力であり、クライアント側リポジトリの整合性が保証されなくなることを意味します。興味がある場合は、gitメーリングリストで「スパースクローン」と「スパースフェッチ」に関するディスカッションを検索してください。

1
Adam