1. ホーム
  2. ギット

[解決済み] [Solved] ファイルを 'git commit' して、その内容の変更を無視することはできますか?

2022-04-18 21:12:51

質問

私のチームのすべての開発者は、自分自身のローカル設定を持っています。 その設定情報は devtargets.rb これは、rakeのビルドタスクで使用されます。しかし、私は開発者がお互いのdevtargetsファイルを食い違えることを望んでいません。

最初に考えたのは、そのファイルを .gitignore のリストを作成し、git にコミットされないようにしました。

そこで私は、ファイルをコミットしても、そのファイルへの変更を無視することは可能なのだろうかと考え始めた。つまり、デフォルトバージョンのファイルをコミットしておけば、開発者がローカルマシンでそれを変更したときに git がその変更を無視し、git status や git commit を実行しても変更されたファイルのリストに表示されなくなるということですね。

そんなこと可能なんですか? 確かにいい機能だと思うのですが...。

解決方法は?

確かに、私も時々このような使い方をします。

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

元に戻してトラッキングを再開するには(どのファイルがアントラックされたか忘れてしまった場合。 この質問を見る ):

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

関連ドキュメント :

--[no-]assume-unchanged(変更なし

このフラグが指定された場合、パスに記録されているオブジェクト名は更新されません。その代わり、このオプションはパスの "assume unchanged" ビットを設定/解除します。assume unchanged"ビットがオンの時、ユーザーはファイルを変更しないことを約束し、作業ツリー・ファイルがインデックスに記録されているものと一致することをGitが仮定することを許可します。もし作業ツリーファイルを変更したい場合は、このビットをアンセットしてGitに伝える必要があります。これは、非常に低速なファイルシステムで大きなプロジェクトを扱うときに便利です。 lstat(2) システムコール (例: cifs) を使用します。

Git は、例えばコミット時にインデックス内のこのファイルを修正する必要がある場合、(優雅に)失敗します。したがって、想定される未追跡のファイルが上流で変更された場合は、手動で対処する必要があります。

この場合のFail gracefullyとは、pullを行う際に上流でそのファイルに何らかの変更(正当な変更など)があった場合、その旨を表示することです。

$ 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
 

となり、マージを拒否されます。

この場合、ローカルの変更を元に戻すことで、この状況を打開することができます。

 $ git checkout filename.ext

を設定した後、再度プルしてローカルファイルを再修正するか、あるいは –no-assume-unchanged で、その時点で通常のstashやmergeなどを行うことができます。