web-dev-qa-db-ja.com

Git-「assume-unchanged」と「skip-worktree」の違い

リポジトリにコミットしたくないファイルにローカル変更があります。これは、サーバー上でアプリケーションを構築するための構成ファイルですが、異なる設定でローカルに構築したいです。当然、ステージングするものとして「git status」を実行すると、ファイルが常に表示されます。この特定の変更を非表示にし、コミットしません。ファイルに他の変更を加えません。

少し掘り下げた後、「仮定なし」と「スキップワークツリー」という2つのオプションが表示されます。前の質問 here はそれらについて話しますが、実際にはそれらの違いを説明しません。私の質問はこれです:2つのコマンドはどう違うのですか?誰かがどちらか一方を使用するのはなぜですか?

350
ckb

skip-worktreeが必要です。

assume-unchangedは、ファイルのグループが変更されているかどうかを確認するのに費用がかかる場合のために設計されています。ビットを設定すると、git(もちろん)は、インデックスのその部分に対応するファイルが作業コピーで変更されていないものと見なします。したがって、stat呼び出しの混乱を回避できます。このビットは、インデックス内のファイルのエントリが変更されるたびに失われます(したがって、ファイルがアップストリームに変更されると)。

skip-worktreeはそれ以上です:gitがファイルが変更された(またはreset --hardなどで変更する必要がある)ことを知っている場合でも、変更されていないふりをします代わりにインデックスのバージョンを使用します。これは、インデックスが破棄されるまで持続します。

この違いの影響と典型的な使用例の良い要約がここにあります: http://fallengamer.livejournal.com/93321.html .

その記事から:

  • --assume-unchangedは、開発者should n’tがファイルを変更することを前提としています。このフラグは、SDKなどの変更されないフォルダーのパフォーマンスの改善を対象としています。
  • --skip-worktreeは、開発者shouldが変更するため、特定のファイルに触れないようにgitに指示するときに役立ちます。たとえば、メインリポジトリアップストリームが本番環境に対応している設定ファイルをホストしており、それらのファイルに誤って変更をコミットしたくない場合、--skip-worktreeがまさに必要です。
522
Borealid