すでに多数のファイルを追跡している既存のリポジトリに.gitignoreを適用する


314

リポジトリに既存のVisual Studioプロジェクトがあります。最近、プロジェクトに.gitignoreファイルを追加しましたが、ファイルにリストされているファイルを無視するようにGitに指示していると思います。

私の問題は、これらのすべてのファイルが既に追跡されており、私が知る限り、Gitはこのファイルにルールを追加する前にすでに追跡されていたファイルを無視しないことです。

それを使用することが提案されました:git rm --cachedそして手動でそれらを追跡解除しますが、それは私がそれらを一つずつ通過するのに永遠にかかります。

リポジトリを削除して再作成することを考えましたが、今度は.gitignoreファイルが存在するので、これを行うにはもっと良い方法があるはずです。


1
役立つ場合git rm --cachedは、-rオプションでディレクトリ全体を作成できます
Nathan Wallace



回答:


870

この答えは私の問題を解決しました:

まず、保留中の変更をすべてコミットします。

次に、次のコマンドを実行します。

git rm -r --cached .

これにより、インデックスからすべてが削除され、次のように実行します。

git add .

コミットする:

git commit -m ".gitignore is now working"

9
完璧な答え!git push originリモートリポジトリの変更を反映するには、も追加してください。
Sanket Berde

8
私はこの答えを使い始めました...そしてそれは私のプロジェクトのほとんどすべてを削除しました!明らかに私は何か間違ったことをしていました。しかし、私は人々にこの提案に気軽に従わないように警告したいと思います。
マークオルバート

4
ファイルを削除して再度追加すると、ファイルの履歴が失われますか
Aran Mulholland

10
この.gitignore is now workingメッセージを使用しているコミットはいくつあるのでしょうか。:)
ihavenoidea

1
この方法は私にはうまくいきました。私はgitignoreファイルを作成し、ディレクトリ全体を無視してから、gitignoreを作成するこの変更をコミットしました。その後、上記の3つのコマンドを正確に実行しました。それは完全に機能しましたが、先に述べたように、最初に「保留中のすべての変更をコミット」する必要があると言う必要があります。
Erich Meissner

61
  1. .gitignoreファイルを作成します。そのためには、空の.txtファイルを作成するだけです。

  2. 次に、cmdに次の行を書き込んで名前を変更する必要があります(git.txtは、作成したファイルの名前です)。

    rename git.txt .gitignore

  3. 次に、ファイルを開いて、無視するすべての追跡されていないファイルを完全に書き込むことができます。たとえば、私の場合は次のようになります。

「」

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

GitHubによる有用な.gitignoreファイルのコレクション全体があります。

  1. これができたら、他のファイルと同じようにgitリポジトリに追加する必要があります。リポジトリのルートにある必要があります。

  2. 次に、ターミナルで次の行を記述する必要があります。

    git config --global core.excludesfile〜/ .gitignore_global

公式ドキュメントから:

また、コンピューター上のすべてのGitリポジトリー内のファイルを無視するためのルールのリストであるグローバル.gitignoreファイルを作成することもできます。たとえば、〜/ .gitignore_globalにファイルを作成し、それにいくつかのルールを追加します。

ターミナルを開きます。端末で次のコマンドを実行します。git config --global core.excludesfile〜/ .gitignore_global

リポジトリが既に存在する場合は、次のコマンドを実行する必要があります。

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

手順2が機能しない場合は、追加するファイルのホールルートを作成する必要があります。


4
@Karen_Wiznia "git config ... _global"は、コンピューター上のすべてのGitリポジトリに対してグローバルギティンゴアを作成します。OPはそうしたくありませんでした。
ivan7707 2015

私はこれが複数回好きになることができればいいのに、このリマインダーを求めてこの質問に何度も戻ってきます。
Antony D'Andrea

1
「rename git.txt .gitignore」ではなく、「mv git.txt .gitignore」にしてください。
Ahmad F

30

ここで指定しとおり、インデックスを更新できます。

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

これを行うと、ファイルはgit statusまたはに表示されなくなりますgit diff

ファイルの追跡を再開するには、次を実行します。

git update-index --no-assume-unchanged /path/to/file

5
これはより良い答えです-それは単一のファイルにのみ焦点が当てられており、リポジトリによって追跡されたくないファイルです。最も高いマークの回答も機能しますが、gitによる追跡からファイルを単に無視するだけではありません。
Chris Mejka

1
これはいいです。しかし、もし私たちが引っ張ったらどうなるでしょう?マージの競合はありますか?
pramod

@pramod、素晴らしい質問。よくわかりません。シンプルなテストリポジトリで試してみませんか?
Patrick James McDougle

15

追加が.gitignore遅すぎた場合、gitは関係なく、すでにコミットされたファイルを追跡し続けます。これを修正するには、不要なファイルのすべてのキャッシュされたインスタンスをいつでも削除できます。

まず、実際に追跡しているファイルを確認するには、次のコマンドを実行します。

git ls-tree --name-only --full-tree -r HEAD

そのようなディレクトリで不要なファイルを見つけたとしましょうcache/。すべてのファイルではなく、そのディレクトリをターゲットにする方が安全です。

だから代わりに:

git rm -r --cached .

不要なファイルまたはディレクトリをターゲットにする方が安全です。

git rm -r --cached cache/

次に、すべての変更を追加します。

git add .

そしてコミット...

git commit -m ".gitignore is now working"

リファレンス:https : //amyetheredge.com/code/13.html


リポジトリ全体ではなく、いくつかのファイルのみを削除する場合は、これが最良で明確な答えです。私はあなたに私の親指をあきらめます。
Apuig

2

以下は、現在の除外パターンのセットで無視されるファイルを「追跡解除」する1つの方法です。

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

これにより、ファイルは作業ディレクトリに残りますが、インデックスから削除されます。

ここで使用されるトリックは、存在しないインデックスファイルをgit ls-filesに提供して、追跡されているファイルがないと見なすことです。上記のシェルコードは、インデックスが空の場合に無視されるすべてのファイルを要求し、git rmを使用して実際のインデックスから削除します。

ファイルが「追跡解除」された後、git statusを使用して、重要なものが何も削除されていないことを確認します(その場合、除外パターンを調整し、git reset-pathを使用して、削除されたインデックスエントリを復元します)。次に、「基本」を除外した新しいコミットを作成します。

「クルド」は、古いコミットに残っています。きれいな履歴が本当に必要な場合は、git filter-branchを使用して古いコミットのきれいなバージョンを作成できます(git filter-branchを使用するnbは「履歴を書き換える」ため、プルしたコラボレーターがいる場合は軽く実行しないでください。 「クルド」が最初に導入された後の過去のコミットのいずれか)。


確かな解決策のように聞こえます:)これはLinuxシェル用だと思いますよね?残念ながら、私はWin7ユーザーです。ウィンドウズでこれを行う方法はありますか?
Tohid 2013年

0

ステージング領域からファイルを削除する

git reset HEAD .

すべての変更を追加

git add .

コミットする:

git commit -m ".gitignore is now working"

-1

これは.gitignoreファイルを既存のリポジトリに追加する簡単な方法だと思います。

前提条件

githubアカウントにアクセスするにはブラウザーが必要です。

手順

  1. 必要な(既存の)プロジェクトに新しいファイルを作成し、.gitignoreという名前を付けます。ファイルに.gitignoreという名前を付けるとすぐに、.gitignoreテンプレートの提案プロンプトが表示されます。これらのテンプレートを使用するか、gitignore.ioを使用してgitignoreファイルのコンテンツを生成します。
  2. 変更をコミットします。
  3. このリポジトリを複製します。

楽しんで!


-3

git clean
このランニングでヘルプを利用する

git clean -h

最初に何が起こるかを確認したい場合は、ドライランの-nスイッチを必ず渡してください。

git clean -xn

汚れたゴミを取り除くには

git clean -xdf

注意:削除されるdatabase.ymlのようなローカル設定ファイルを無視しているかもしれません。自己責任。

その後

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