gitignoreを使用してファイルを無視する(ただし削除しない)


97

私のgitリポジトリにtmpディレクトリがありますが、まだ存在しますが無視されます。私はそれをに追加しましたが.gitignoregit statusそのディレクトリ内のファイルへの変更についてはまだ教えてくれます。私は試しましたgit rm -r --cachedが、それはそれをリモートリポジトリから削除します。このディレクトリへの変更の追跡を停止しながら、存在を許可するにはどうすればよいですか?私も1つのファイルに対してこれを行う必要がありますが、それを変更したgit status後も、.gitignoreそれらを変更すると表示されます。私は何をすべきか?


1
あなたの.gitignoreファイルはどのように見えるのか正確に書いてください?
kdehairy

回答:


182

の代わりに.gitignore、次のコマンドを実行してローカルgitリポジトリを更新できます。

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

この場合、ファイルはoriginリポジトリで追跡されています。ローカルリポジトリで変更することができ、gitは変更済みとしてマークしません。続きを読む:


22
私のGitへの愛情は倍増したかもしれません。
マークフォックス

2
これは受け入れられる答えになるはずです。リンクしていただきありがとうございます。
Gowiem 2013

4
これをリモートリポジトリにプッシュする方法はありますか?
Brian Ortiz

2
うーん私はむしろ「でも誰か他のレポでは、それはgitのファイルではありません決して、gitのでそれを同期」としてファイルをマークしないだろう
fantastory

11
で元に戻すことができgit update-index --no-assume-unchanged <file>ます。それらをリストしたい場合git ls-files -v | grep '^h'
Sanghyun Lee

12

ファイルの存在を許可しながらファイルに加えられた変更を無視することが、の正確な目的です.gitignore。したがって、ファイル(またはディレクトリ)を追加する.gitignoreことだけが必要です。

しかし、あなたの問題は、gitが無視したいファイルをすでに追跡しており、.gitignore追跡されたファイルには適用されないことです。この追跡を停止する唯一の方法は、gitにそれらを削除するように指示することです。を使用するとgit rm --cached、gitがローカルファイルを削除するのを防ぐことができますが、変更を取得する他のリポジトリは削除を適用します。あなた自身のリポジトリからそれを回避する方法はないと思います。他のリポジトリで何かを行う必要があります。そうしないと、ファイルが削除されます。

他の各リポジトリでの削除を防ぐには、次の方法があります。

  • (明らかに)ファイルをどこかにバックアップし、変更をプルしてファイルを復元し、
  • またはgit rm --cached、ファイルとコミットしてから変更をプルします。Gitは、すでに追跡されていないファイルに手を加えることなく、2つの削除をうまくマージします。

6
これは真である必要はありません(「追跡の停止=ファイルの削除」)。次のコマンドを使用して、ファイルをリポジトリで追跡し、行われた変更を表示しないようにすることができますgit update-index --assume-unchanged <file>。見てみましょう:blog.pagebakers.nl/2009/01/29/...を
ducin

私はgitの中に押し込んrepositorieからファイルを削除する必要があるため、これは私の問題を解決git rm --cached <filename> -r し、このプッシュが再びrepositorieする変更後のファイルが削除されるように
ヴィニシウスカルドーゾ

7

ファイルの/ディレクトリ名の最後にa を付け.gitignoreます。

tmp/

そのディレクトリ内のファイルを追跡している場合は、まずgitにそのことを忘れるように指示する必要があります(dirを無視リストに追加する前に)。あなたがそこに重要なものは何もないと仮定します(つまり、あなたはそれを傷つけることができると)

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

そのディレクトリ内の新しいファイルは追跡されません。

--cachedオプションgit rmのインデックス(多かれ少なかれ保留中の変更)でのみ動作します。作業ツリーや追跡されているかどうかのステータスには影響しません。


私は持っています。両方the/dir/the/dir/*
21312312

ちょっとマット、無視したい別のフォルダーに/ Mediaのようなものがある場合、それは可能ですか?/ 1 / Media、/ 2 / Mediaのように、99まで好きですか?
ニック

3

.gitignoreは追跡されたファイルには影響しません。

あなたが望むのは、tmp /ディレクトリ内のファイルに仮定されていないビットを設定することです。これを行う方法についての良い説明があります:Git:ローカルリポジトリのみでファイルの追跡を解除し、リモートリポジトリに保存します

また、ディレクトリ内のすべてのファイルでassume-unchangedを設定するためのワンライナー-git update-index --assume-unchanged on directory


1

ファイル(例index.php:)を追跡し、それをリモートリポジトリに追加し、ファイルをリモートに保持している間は追跡の監視を停止しようとしているようです(つまりindex.php、ローカルで変更しながらリモートリポジトリで変更しないでください)。

私の理解から、gitはこれを行うことはできません。ファイルを追跡することも追跡しないこともできます。ファイルを追跡すると、そのファイルはリモートリポジトリに存在し、変更をコミットすると変更されます。ファイルを追跡しない場合、そのファイルはリモートリポジトリに存在しません。

gitでは希望どおりの操作を行うことができないため、状況に応じて他の解決策が考えられます。たとえば、index.phpローカルで変更するときにリモートで変更したくないのはなぜですか?ファイルにユーザー固有の設定はありますか?この場合、次のことができます。

cp index.php index_template.php
git rm --cached index.php

次に、index_template.phpを編集して、リモートリポジトリに表示するようにします。READMEに何かを追加して、リポジトリを使用している人にそれを複製したら、index_template.phpをindex.phpにコピーし、ニーズに合わせて編集する必要があることを伝えます。

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

誰かがあなたのリポジトリを複製するとき、彼らは彼ら自身を作成し​​なければなりませんindex.php。あなたは彼らのためにそれを簡単にしました:単にコンピュータ特有の設定でそれをコピーindex_template.phpindex.phpて修正するだけです。

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