git update-index --assume-unchanged on directory


101

git 1.7.12

特定のディレクトリの下にあるすべてのファイルを、変更されていないものとしてマークしたい

1)git update-index --assume-unchaged dir/「無視するパス」を示します。

2)git update-index --assume-unchaged dir/*追跡されていないファイルが検出されるため、すぐに失敗し、「致命的:ファイルをマークできません」と表示されて終了します。

3)マークするファイルのリストを生成してみてください。 cd目的のディレクトリに移動して、を実行しgit ls-files | tr '\n' ' ' | git update-index --assume-unchangedます。これはエラーメッセージを生成しませんが、ファイルを正常にマークしません。コマンドの最初の部分であるは、git ls-files | tr '\n' ' 'マークするすべてのファイルのスペース区切りリストを正しく生成します。そのコマンドの出力をコピーしてコマンドラインに貼り付けると、git update-indexコマンドは機能します。パイプで何が機能していないのですか?

いいえ、dir.gitignore に追加するだけでは不十分です。これらのファイルをリポジトリに配置する必要がありますが、ユーザーがプルできるように無視する必要がある望ましくない変更がローカルで行われます。

回答:


173

git update-index その標準入力ではなく、コマンドラインでファイル名が必要です。

ステップ1:

cd あなたが仮定したいフォルダに変更されていません

ステップ2:

次のいずれかを実行できます。

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

または

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

ただし、どちらの場合でも、スペースを含むファイル名には問題があります。あなたがそれらを持っているなら、あなたはこれを使うことができます:

git ls-files -z | xargs -0 git update-index --assume-unchanged

編集:に関する@MatthewScharleyからの入力を組み込みましたgit ls-files -z

Windowsコマンド

注: Windowsを使用している場合は、Git Bashを使用してこれらのコマンドを実行します


2
ちなみに、 `| tr '\ n' '' `ビットは不要です。
ヴァーツラフSlavík

7
@twalberg:あなたはそのまま使うことができますgit ls-files -z
Matthew Scharley 2013

2
@twalbergこのコマンドを元に戻す方法 "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Mohamed Hussain

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged、私は思います...
twalberg

1
git ls-files -z | git update-index -z --stdinきれいです。
Jed

22

findGNU Findutils のコマンドには、構文が少し特殊ですが、-execを使用する手間をほとんど取り除くオプションがありますxargs。ただし、スペースを含むファイル名は完全に処理されます。

このコマンドは、gitにリストされたディレクトリ内およびその下のすべてのファイルが変更されていないと想定します。

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Findは(シェルがそれを食べることがないようにエスケープする必要がある-execまで;)すべての引数を取り、見つかったファイルごとに1回実行します{}(一方、(引用符で囲まれているため、シェルがそれを食べないように)見つかったファイルの名前で置き換えます。

使い方findの一致基準を(最大再帰の深さ、試合はファイル名が表現と一致するかどうかを、ファイルであるかディレクトリであるかどうか)と-exec、あなたは強力なもののすべての並べ替えを行うことができます。

findコマンドの他の実装については不明です。YMMV。


2
-exec標準オプションです。あなたもできる-exec git update-index --assume-unchanged {} +のgitコマンドが呼び出された回数を減らし、一度にコマンドに複数のファイル名を通過する(また、標準で定義されました)。
トムフェネック2016

16

にディレクトリ名を追加し.git/info/excludeます。これは追跡されていないファイルに対して機能します。


この作品は素晴らしい!これがファイルでも機能するかどうかご存知ですか?
betomoretti 2016

しかし、これは追跡されていないファイルgithubをプッシュしません!レコードからそれらを単に無視することが可能な方法はありますか?
Mahmoud Zalt 2017年

2

うん、

git update-index --assume-unchanged

ファイルではなく、ディレクトリでのみ機能します。私は、より速い方法の1つだと思います:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
を使用する代わりにcd、dirを最後の引数として渡すことができますgit ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
kzh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.