すでにチェックインされているディレクトリの内容を無視しますか?


227

いくつかのプロジェクトで使用されるグラフィックスとサウンドファイルを保持するためだけに使用されるgitリポジトリがあります。それらはすべてサブディレクトリのない1つのディレクトリにあります。次に、これらのアセットを、いくつかのレベルのサブディレクトリを持つ別の構造化ディレクトリからコピーするスクリプトを作成しました。

ここで、(ソース)階層ファイル構造のみをgitで追跡し、(ターゲット)フラットディレクトリ(すべてのファイルが1つの山になっている)は無視する必要があります。

ターゲットディレクトリを.gitignoreに追加しましたが、gitはその中の変更を引き続き追跡しています。ターゲットディレクトリの古いファイルの削除をコミットすると、gitが新しいコンテンツ(スクリプトによってコピーされたもの)の追跡を停止する可能性があると思いましたが、そうではありません。

ターゲットディレクトリについてgitを忘れさせるにはどうすればよいですか?


ディレクトリ名とは何ですか。また、.gitignoreに何を入れましたか
mmmmmm

1
名前はDirNameIrrelevantで、.gitignoreで「DirNameIrrelevant」、「DirNameIrrelevant /」、および「DirNameIrrelevant / *」を配置しようとしました
Felixyz

回答:


524

このコマンドにより、gitはディレクトリとその下のすべてのファイルを実際に削除せずに追跡を解除します。

git rm -r --cached <your directory>

この-rオプションを使用すると、ディレクトリ内のすべてのファイルが削除されます。

この--cachedオプションでは、作業コピーではなく、ファイルがgitのインデックスからのみ削除されます。デフォルトでgit rm <file>は削除され<file>ます。


ああ、ありがとう。これが必要な理由はわかりませんが、非常に便利です(.gitignoreにdirを追加するのに十分ではないのはなぜですか?)。--cachedの目的は何ですか?
フェリクシー、2009

承知しました。2つのオプションを説明するために、回答を修正しました。
ゴードンウィルソン

なぜこれが必要なのかについては、推測しかできません。プロジェクトの重要な部分を誤って追跡解除するリスクを減らすために、作成者はファイルの追跡解除を明示的にしたいと思います。技術的な理由もあると思います。
ゴードンウィルソン

15
gitignoreは、gitが認識する追跡されていないファイルを判別するために使用されます。すでに追跡されているファイルには影響しません。ユーザーが無視したファイルを追跡したい場合、gitはそれらを許可します。これは、を使用して行うadd -fか、状況に応じて行うことができます。ゴードンが言ったように、これはあなたが誤ってたくさんのファイルを一掃するのを防ぎます-リポジトリはgitignoreではなくマスターリストです。これにより、ワイルドカードルールによって無視されるいくつかのことを手動で追跡することもできます。
カスカベル

-rオプションは、「ディレクトリ下のすべてのファイルの削除を原因」するのではなく、むしろサブディレクトリを再帰します。
MrE、2015

78

追跡ファイル(チェックイン済み)が必要だが、ローカルリポジトリとリモートリポジトリにファイルを保持したまま、ファイルの変更を追跡したくない場合は、次のように実行できます。

git update-index --assume-unchanged path/to/file.txt

その後、このファイルへの変更はに表示されなくなりますgit status


1
OPがディレクトリを要求した可能性がありますが、これはまさに私が探していたものです。単一のチェックインされたファイルに対するそれ以上の変更は無視されます。ありがとう!
sdaau 2014年

1
ディレクトリを完全に無視するには、「git update-index --assume-unchanged dirName / *」を使用します。構文を見つけるのにしばらく時間がかかりました。ここでは「*」が必要です
J-Dizzle

1
どうすればこれを逆転できますか?
Rhys、2017

3
@Rhysで逆転:git update-index --no-assume-unchanged dirname/**/*
JobJob 2017

3

blah/gitに追加されたというサブディレクトリの場合、以下の両方がの新しいファイルを無視するように機能しているようですblah/。.gitignoreに追加:

blah 
blah/*

1

TL; DRを実行してgitリポジトリをクリーンアップし、無視されたすべてのアイテムが実際に無視されていることを確認します。

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

注:ディレクトリを指定する必要はありません。このようにして、リモートリポジトリ全体をクリーンアップします。

これをさらに読むに


0

これが私にとって悪い人になるかどうかはわかりませんが、ここではそれが起こります。

  1. *Generated*ルートの.gitignoreファイルに追加しました
  2. 保持したいファイルをGeneratedFile.Whatever.extとして送信しました。チェックインした
  3. 私はこれを行うPowerShellスクリプトを呼び出すためにポストチェックアウトにgitフックを作りました:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

私は自分自身に少し気分が悪いのですが、実際にはうまくいきます。


-2

まず、ディレクトリを完全に空(古いファイルでも新しいファイルでもない)でチェックインする必要があります。その後追加されたファイルはすべて無視されます。コミットする前に古いファイルの追加と新しいファイルを削除すると、新しいファイルは無視されますが、リポジトリに追加されます。

少なくとも、これは私にとってこの状況でうまくいきました。誰かが何が起こっているのかについてより多くの洞察を提供できれば、それでも素晴らしいでしょう。


1
私たちが他の場所で言ったことの短いバージョン-gitignoreは、gitが認識する追跡されていないデータに影響を与えます。それはあなたがそれについて言った(例えば、それをリポジトリに追加するように指示した)データで何が行われるかには影響しません。
カスカベル

したがって、追跡されて現在削除されているファイルを追跡する必要があることは理にかなっていますが、追加されたファイル(次のコミットの前に行われた場合)が追跡されることは意味がありません。無視、2)ファイルを削除、3)コミット、4)新しいファイルを追加、新しいファイルは追跡されません。
フェリクジーズ2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.