私のチームの開発者はそれぞれ独自のローカル構成を持っています。その構成情報は、rake ビルド タスクで使用される というファイルに保存されますdevtargets.rb
。ただし、開発者が互いの devtargets ファイルを上書きすることは避けたいと考えています。
私が最初に考えたのは、そのファイルをリストに入れて、.gitignore
git にコミットされないようにすることでした。
そこで、私は疑問に思い始めました。ファイルをコミットしながら、ファイルへの変更を無視することは可能なのでしょうか? そこで、ファイルのデフォルト バージョンをコミットし、開発者がローカル マシンでそのファイルを変更すると、git は変更を無視し、git status または git commit を実行しても変更されたファイルのリストに表示されなくなります。
それは可能ですか?確かに素晴らしい機能ですね...
ベストアンサー1
確かに、私は時々これを使って
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
、その時点で通常のスタッシュやマージなどを実行できます。