1. 概要

Git ステージング領域のファイルを手動で操作する場合は、 gitupdate-indexを使用します。 このコマンドは、よく誤用される2つのオプション –assume-unchanged–skip-worktreeをサポートします。

このチュートリアルでは、これら2つのオプションの違いを確認し、それぞれの使用例を示します。

2. 仮定-変更なしオプションは何をしますか?

–assume-unchanged オプションは、追跡されたファイルが作業ツリーで変更されていないと一時的に想定するようにGitに指示します。 したがって、加えられた変更はステージング領域に反映されません。

$ git update-index --assume-unchanged assumeunchanged.txt

git ls-files を使用して、ファイルのステータスを確認できます。

$ git ls-files -v
$ h assumeunchanged.txt 

ここで、 h タグは、assert-unchanged.txtassumed-unchangedオプションでマークされていることを示します。

主にその目的で使用されますが、変更されていないオプションは、追跡されたファイルへの変更を無視することを意図したものではありません。 これは、ファイルのグループが変更されているかどうかを確認するのに費用がかかる場合のために設計されています。 低速のファイルシステムでリソースの使用を最適化する場合はどうなりますか。gitはターゲットファイルに対するチェックを省略し、作業ディレクトリとインデックスのバージョンを比較しません。

この機能は、インデックス内のターゲットファイルのエントリが変更されるたびに失われます。 これは、ファイルがアップストリームで変更されたときに発生する可能性があります。 このオプションの設定を解除するには、 –no-assume-unchangedを使用できます。

$ git update-index --no-assume-unchanged assumeunchanged.txt

3. skip-worktree オプションは何をしますか?

–skip-worktree オプションは、すでに追跡されているファイル内のコミットされていない変更を無視します。 作業ツリーで行われた変更に関係なく、gitは常にステージング領域のファイルコンテンツと属性を使用します。 これは、ローカルの変更をアップストリームにプッシュせずにファイルに追加する場合に便利です

$ git update-index --skip-worktree skipworktree.txt

ファイルのステータスを確認できます。

$ git ls-files -v
$ S skipworktree.txt 

ここで、 S は、skip-worktree.txtskip-worktreeオプションでマークされていることを示します。

このオプションは、ファイルがインデックスで変更された場合、つまりファイルがアップストリームで変更された場合に自動的に設定解除され、ファイルをプルします。

–no-skip-worktree は、このオプションの設定を解除するために使用されます。 間違ったファイルにフラグが付けられた場合、または状況が変化して以前にスキップされたファイルが無視されなくなった場合に役立ちます。

$ git update-index --no-skip-worktree skipworktree.txt

4. オプションの違い

4.1. ブランチスイッチング

ファイルで–skip-worktree オプションがオンになっている場合、ブランチをチェックアウトするときに問題はありません。 ただし、 –assume-unchangedはエラーを発生させます。

$ git checkout  another-branch
error: Your local changes to the following files would be overwritten by checkout:
        assumeunchanged.txt
Please commit your changes or stash them before you switch branches.
Aborting

この状況を克服するためのオプションを設定解除できます。

$ git update-index --no-assume-unchanged assumeunchanged.txt 
$ git checkout another-branch 
Switched to branch 'another-branch'

4.2. 優先順位

–skip-worktree は、両方が設定されている場合、—仮定-変更されていないビットよりも優先されます。  ファイルに両方のオプションを設定してみましょう。

$ git update-index --assume-unchanged --skip-work-tree worktree-assumeunchanged.txt

ファイルのステータスにより、skip-wortkreeの優先順位が確認されます。

$ git ls-files -v
$ S worktree-assumeunchanged.txt

5. 結論

この記事では、Gitの— assert-unchanged オプションと— skip-worktreeオプションの使用法の違いについて説明しました。 また、それらの優先順位と、ローカルおよびアップストリームブランチとの相互作用についても説明しました。