web-dev-qa-db-ja.com

1つのフォルダーを除くGITチェックアウト

他のブランチまたは以前のコミットにチェックアウトしたいのですが、1つのフォルダーを同じファイルに保持したい(フォルダーをチェックアウトしない)。

フォルダがgit statusに表示されるようにしたいので、このフォルダをインデックスに追加できます。

たとえば、node_modulesのフォルダがあります。フォルダーをすべてのコミットに含める必要があります(ほとんどの人がnode_modulesフォルダーを.gitignoreすることを好むことを知っています)。しかし、他のコミットに移動したり、他のブランチをチェックアウトしたりするときは、gitnode_modulesフォルダーに触れないようにします。

出来ますか?

15

スパースチェックアウト を使用して、node_modulesディレクトリのコミットされたコンテンツを作業ツリーから除外できます。ドキュメントにあるように:

「スパースチェックアウト」を使用すると、作業ディレクトリにスパースにデータを入力できます。 skip-worktreeビットを使用して、作業ディレクトリ内のファイルを確認する価値があるかどうかをGitに通知します。

使い方は次のとおりです。まず、sparseCheckoutオプションを有効にします。

git config core.sparseCheckout true

次に、node_modulesパスを否定として.git/info/sparse-checkoutファイルに追加します。

echo -e "/*\n!node_modules" >> .git/info/sparse-checkout

これにより、以下を含むsparse-checkoutというファイルが作成されます。

/*
!node_modules

これは事実上、無視node_modulesコミットのツリーを作業ディレクトリに読み込むときのディレクトリを意味します。

後でnode_modulesディレクトリを再度含める(つまり、ファイルから skip-worktreeビット を削除する)場合は、sparse-checkoutファイルを変更して/*のみを含める必要があります(つまり、「すべてのパスを含める」)。 git read-treeを使用した作業ディレクトリ:

echo "/*" > .git/info/sparse-checkout
git read-tree -mu HEAD

次に、構成変数をfalseに設定することにより、スパースチェックアウトを完全に無効にすることができます。

git config core.sparseCheckout false

スパースチェックアウトGit 1.7. で最初に導入されたことに注意してください。

27