web-dev-qa-db-ja.com

ファイルを「git commit」して、その内容の変更を無視できますか?

私のチームのすべての開発者は、独自のローカル構成を持っています。その構成情報は、rakeビルドタスクで使用されるdevtargets.rbというファイルに保存されます。ただし、開発者が互いのdevtargetsファイルを上書きすることは望ましくありません。

最初に考えたのは、そのファイルを.gitignoreリストに入れて、gitにコミットされないようにすることでした。

それから私は疑問に思い始めました:ファイルをコミットすることは可能ですが、ファイルへの変更を無視しますか?そのため、デフォルトバージョンのファイルをコミットし、開発者がローカルマシンで変更すると、gitは変更を無視し、git statusまたはgit commitを実行しても変更されたファイルのリストに表示されません。

それは可能ですか?それは確かに素晴らしい機能でしょう...

312
Derick Bailey

確かに、私は時々これを正確に使用します

git update-index --assume-unchanged [<file> ...]

元に戻して追跡を再開するには(追跡されなかったファイルを忘れた場合、 この質問を参照 ):

git update-index --no-assume-unchanged [<file> ...]

関連ドキュメント

-[no-] assume-unchanged
このフラグを指定すると、パスに対して記録されたオブジェクト名は更新されません。代わりに、このオプションは、パスの「変更なしと想定」ビットを設定/設定解除します。 「変更しないと仮定する」ビットがオンの場合、ユーザーはファイルを変更しないことを約束し、Gitが作業ツリーファイルがインデックスに記録されているものと一致すると仮定できるようにします。作業ツリーファイルを変更する場合は、ビットを設定解除してGitに通知する必要があります。これは、lstat(2)システムコールが非常に遅いファイルシステム(cifsなど)で大きなプロジェクトを操作するときに役立つことがあります。

Gitは、インデックス内のこのファイルを変更する必要がある場合に(正常に)失敗します。コミットにマージするとき;したがって、想定されていない未追跡ファイルがアップストリームで変更された場合、状況を手動で処理する必要があります。

この場合、正常に失敗とは、プルを行うときにそのファイルの上流に何らかの変更(正当な変更など)があった場合、次のように表示されることを意味します。

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> Origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

マージを拒否します。

その時点で、ローカルの変更を元に戻すことでこれを克服できます。次の1つの方法があります。

 $ git checkout filename.ext

その後、再度プルしてローカルファイルを再変更するか、–no-assume-unchangedを設定し、その時点で通常のスタッシュやマージなどを行うことができます。

409
Rob Wilkerson

これを行うための好ましい方法は、説明されているようにgit update-index --skip-worktree <file>を使用することです この回答では

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

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

これを元に戻すには、git update-index --no-skip-worktree <file>を使用します

77
1615903

一般的な方法は、devtargets.default.rbを作成してコミットし、そのファイルをdevtargets.rb(.gitignoreリストにある)にコピーするように各ユーザーに指示することです。たとえば、CakePHPは、マシンごとに自然に変化するデータベース構成ファイルに対して同じことを行います。

37
erjiang

IntelliJ IDEAユーザーの場合:ファイルの変更を無視する場合は、別のChange Setに移動できます。

  • Local ChangesCmd + 9)に向かいます
  • 無視するファイルを選択します
  • F6で別のChange Setに移動します
0
Eugene