ファイルを「git commit」してコンテンツの変更を無視できますか?


355

私のチームのすべての開発者は、独自のローカル構成を持っています。その構成情報は、devtargets.rb、rakeビルドタスクで使用さ。ただし、開発者がお互いのdevtargetsファイルを破壊しないでください。

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

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

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


1
同様のトピックについては、stackoverflow.com / questions / 3318043 /…も参照してください。
VonC、2010


回答:


458

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

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して、その時点で通常のスタッシュやマージなどを実行できます。


10
このコマンドはローカルで.gitフォルダー内で機能しますか?つまり、config.phpファイルに対してこのコマンドを実行すると、リポジトリを使用している他のユーザーに伝播されますか?
Magus

16
@Magus:いいえ。これはあなたのためにのみ動作します。
Rob Wilkerson、2015

3
そして、すぐ後にファイルが変わらないと仮定されている方法を決定するために、知りたいしようとしている:stackoverflow.com/questions/2363197/...
チロSantilli郝海东冠状病六四事件法轮功

10
この方法で無視されたファイルへの変更は、「git stash」を使用すると失われます。それを回避する方法はありますか?
Alexis

5
これはgit update-index --assume-unchanged目的ではありません。 public-inbox.org/git/...
jsageryd

97

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

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

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

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

gitバージョン2.25.1以降、これも推奨される方法ではなくなりました。

追跡されているファイルへの変更を無視するようにGitに指示するために、ユーザーは多くの場合、assume-unchangedおよびskip-worktreeビットを使用しようとします。Gitは特定の操作を実行するときにインデックスに対して作業ツリーファイルを引き続きチェックする可能性があるため、これは期待どおりに機能しません。一般に、Gitは追跡されたファイルへの変更を無視する方法を提供しないため、代替ソリューションが推奨されます。

たとえば、変更するファイルがなんらかの構成ファイルである場合、リポジトリにはサンプルの構成ファイルを含めることができます。この構成ファイルは無視された名前にコピーして変更できます。リポジトリには、サンプルファイルをテンプレートとして扱い、変更して自動的にコピーするスクリプトを含めることもできます。


これは、リポジトリをチェックアウトするすべてのユーザーで機能しますか?特定のファイルを取得しますが、明示的に指定しない限り、誤って変更を追加できなくなりますか?
mmm

2
@momomoフラグはインデックスに保存されるため、1人のユーザーのみが使用できます。すべてのユーザーで機能するものについては、erjiangの回答を参照してください。
-1615903

私はファイルの内容がどうあるべきかを理解しようとしています。あなたが言及した答えについてコメントしましたが、答えはありませんでした。それはどこにあると思われ、その内容は何ですか?あなたは知っていますか?
mmm

フォローしていません。コマンドは、コマンドで指定した特定のファイルを無視するために使用されます。そのファイルの内容は関係ありません。
-1615903

1
Gitのドキュメントは、特に使用しないと言いgit update-index --skip-worktree、この目的のために。
bk2204

43

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


6
追跡されているファイルを.gitignoreすることはできません。.gitignoreは、インデックスに含まれていないファイルに対してのみ効果があります。
CBベイリー

1
私はこれを避けようとしていましたが、本当に正当な理由はありません。私たちは今それをやっていて、名前に ".default"を付けずに自分のバージョンを作成する必要があることを覚えておくのは苦痛だと思います。
デリックベイリー

11
@DerickBaileyしかし、公平を期す--assume-unchangedために、リポジトリのクローンを作成するすべての人にオプションを使用するよりも、ファイルをコピーする方が覚えやすいです。
Dan

1
@DerickBaileyを使用すると、rakeビルドが存在しないdevtargets.default.rb場合のデフォルトに設定することもできますdevtargets.rb
ルーク

@erjangそのdevtargets.default.rbファイルには何がありますか?例?
mmm

2

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

  • 頭の上Local ChangesCmd + 9)に
  • 無視するファイルを選択してください
  • F6 それらを別の場所に移動する Change Set
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.