Git - 「assume-unchanged」と「skip-worktree」の違い 質問する

Git - 「assume-unchanged」と「skip-worktree」の違い 質問する

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

明確に言うと、.gitignore を使用するのは、新しいファイルが追加されないようにするだけなので、私が望んでいることではありません。リポジトリに既に存在するファイルへの変更を無視したいのです。

調べてみると、2つの選択肢が見つかりました。以前のassume-unchanged質問skip-worktreeここそれらについて話しますが、それらの違いを実際に説明していません。

2 つのコマンドの違いは何ですか? どちらか一方を使用するのはなぜですか?

ベストアンサー1

使用したいものskip-worktree

git update-index --skip-worktree <file_name>

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

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

この違いの影響と一般的な使用例については、次のリンクにわかりやすくまとめられています。http://fallengamer.livejournal.com/93321.html

その記事より:

  • --assume-unchanged開発者がファイルを変更してはならないことを前提としています。このフラグは、SDK などの変更されないフォルダーのパフォーマンスを向上させるためのものです。
  • --skip-worktree開発者が変更する必要があるため、git に特定のファイルを一切変更しないように指示する場合に便利です。たとえば、メイン リポジトリ アップストリームが本番環境対応の設定ファイルをホストしていて、それらのファイルへの変更を誤ってコミットしたくない場合は、--skip-worktreeまさにこれが必要なことです。

おすすめ記事