git update-index --assume-unchanged <file>を元に戻します


463

Gitが特定のディレクトリ/ファイルの監視/追跡を無視する方法。あなたはこれを実行します:

git update-index --assume-unchanged <file>

では、どのようにして元に戻して、彼らが再び見られるようにしますか?(想定外と呼びましょう。)


5
gitのパフォーマンスに問題がない限り、skip-worktreeは、assume-unchangedよりも使用した方がよいと思われる可能性が高いと言えます。 stackoverflow.com/questions/13630849/...
GreenAsJade

回答:


587

未変更と見なされるように設定されている元に戻す/ディレクトリを表示するには、次のコマンドを実行します

git update-index --no-assume-unchanged <file>

これをassume-unchanged実行するディレクトリ/ファイルのリストを取得するには

git ls-files -v|grep '^h'


7
最初の文字のタグが「H」/「h」以外の文字である可能性があるため、grepステートメントのマイナーな改善。無視されたすべてのファイルをキャッチするために「^ [az]」を使用できます。git-scm.com/docs/git-ls-filesから:このオプションは、各行の先頭にある次のタグ(スペースが後に続く)でファイルのステータスを識別します。H ::キャッシュされたS :: skip-worktree M: :マージされていないR ::削除/削除されたC ::変更/変更されたK ::
キル

8
もう1つの便利なトリックはですgit ls-files -v|grep '^h'|cut -c3-。これは、「h」プレフィックスなしでファイル名だけを提供します。
Retsam 2014年

9
自分が知っているファイルがわからなくなった場合はassume-unchanged、を使用してくださいgit update-index --really-refresh。このコマンドを使用すると、git ls-files最初にファイルを探す必要がありません。
theDmi

103

これが頻繁に使用するコマンドである場合、別名を付けることも検討してください。グローバルに追加.gitconfig

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

エイリアスを設定する方法(まだわからない場合):

git config --configLocation alias.aliasName 'command --options'

例:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

これをに保存した後.gitconfig、よりクリーンなコマンドを実行できます。

git hide myfile.ext

または

git unhide myfile.ext

このgitドキュメントは非常に役に立ちました。

コメントの通り、これは現在どのファイルが隠されているを知るのに役立つエイリアスです

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
このエイリアスも便利ですhidden = ! git ls-files -v | grep '^h' | cut -c3-
。– seanf

42

git update-index関数には、次のように入力できるいくつかのオプションがあります。

git update-index --help

ここには、さまざまなオプションがあります-関数update-indexで処理する方法。

[ファイル名がわからない場合]

git update-index --really-refresh 

[ファイル名がわかっている場合]

git update-index --no-assume-unchanged <file>

無視リストに追加されたすべてのファイルを元に戻します。

git update-index --assume-unchanged <file>

gitの更新インデックス--reallyリフレッシュ、すべての前提と-変わらず、私が行ったことを、先端に感謝を元に戻す
セルジオ

git update-index --no-assume-unchanged <file>私の命を救った。わかりました。フォルダをもう一度同期することができましたが、この問題の「実際の」解決策が必要でした。
Cagatay Ulubay 2017年

38

私はオプションを--assume-unchanged表示していないので、(へ)あなたが意味したと思い--assume-changedます。の逆は--assume-unchangedです--no-assume-unchanged


32

@ adardesign、@ adswebwork、@ AnkitVishwakarmaからの優れた元の回答、および@ Bdoserror、@ Retsam、@ seanf、@ torekからのコメントを、追加のドキュメントリンクと簡潔なエイリアスを使用して合成するには...

基本的なコマンド

するには、ファイルのリセットであると仮定し、そのまま正常に戻りました:

git update-index --no-assume-unchanged <file>

変更されていないと見なされるすべてのファイルをリストするには、次のようにします。

git ls-files -v | grep '^[a-z]' | cut -c3-

するには、すべてリセット前提とし、変更されていないファイルが正常に戻っ:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

注:他の場所にリストされているこのコマンドは、すべての想定されていない変更されていないファイルをリセットするようには見えません(私はそれが以前に解決策としてリストされていたと思います):

git update-index --really-refresh

ショートカット

これらの一般的なタスクをgitで簡単に実行できるようにするには、ユーザー用に次のエイリアスセクションを追加/更新し.gitconfigます(例:~/.gitconfig* nixまたはmacOSシステム):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
git hidden使用して、シェルのエイリアスやスクリプトなしで同じ効果を得ることができ、!このようにhidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshインデックスファイルの想定された変更されていないフラグをクリアしません(または、そうしなくなった可能性があります。
torek

@torek、ありがとう!あなたが説明した動作を確認し、「すべてリセット」のケースに対する別の解決策で回答を更新しました。
ウィルケイン

20

適用されたすべてのファイルを元に戻すには、キャッシュされているだけでなく、ステータスも変更されていないと見なす場合(gitは小文字で文字でマークします)、次のコマンドを使用できます。

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v すべてのファイルとそのステータスを印刷します
  2. grep '^[a-z]' ファイルをフィルタリングし、変更されていないものと仮定するだけを選択します
  3. cut -c 3- ステータスを削除し、パスのみを残して、3番目の文字から最後まで切断します
  4. tr '\012' '\000' 行末文字(\ 012)をゼロ文字(\ 000)に置き換えます
  5. xargs -0 git update-index --no-assume-unchangedgit update-index --no-assume-unchanged元に戻すためにゼロ文字で区切られたすべてのパスを渡します

これはとても便利です。詳細情報ありがとうございます!
Chamithra Thenuwara

11

追加@adardesignあなたが追加されているすべてのファイルをリセットしたい場合は、答えのassume-unchangedために、リストno-assume-unchanged1回では、次の操作を実行できます。

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

これは単にgrep ieから出力される2文字を取り除き"h "、ファイル名に存在する可能性のあるスペースをエスケープ|| trueし、ループ内の一部のファイルにエラーがある場合にコマンドが途中で終了するのを最後に防ぎます。


4

Git Extensionsを使用している場合は、以下の手順に従います。

  1. コミットウィンドウに移動します。
  2. [ 作業ディレクトリの変更 ]というドロップダウンをクリックします
  3. [ 想定未変更ファイルを表示 ]オプションを選択します。
  4. 削除するファイルを右クリックします。
  5. [ 前提条件を変更しない]を選択ます。

完了です。


0

ここではカバーされないものはありません。しかし、私の2セントを追加したいと思います。時々、私はビルドを実行し、それが多くのファイルを変更し、それから何かに取り組みたいので、このコマンドは本当に私を助けてくれます。

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

他の誰かにも役立つと思います。


.gitignoreビルドアーティファクトを無視するためにを使用することにはメリットがあると思います。
Nick

1
私は持って.gitignoreいますが、それは時々、私の経験では十分ではありません。しかし、私はあなたがこれを言っている文脈を理解しています。
Tyagi Akhilesh

0

Windowsでは、どのソリューションも機能しませんでした。ファイルステータスではHなく、資本を使用しているようhです。grepコマンドでは、^行頭と次の文字の否定を表すため、追加のキャレットが必要です。

Windowsソリューション

  1. Git Bashを開き、関連する最上位ディレクトリに移動します。
  2. git ls-files -v | grep '^^H' キャッシュされていないすべてのファイルを一覧表示するには
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree 経由で行われたすべてのファイルをスキップしてファイルを元に戻す update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged 経由で行われたすべてのファイルをスキップしてファイルを元に戻す update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' 再びすべてのキャッシュされていないファイルを一覧表示し、上記のコマンドが機能しているかどうかを確認します-これは何も返さないはずです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.