.gitignoreに追加した後、リモートリポジトリからディレクトリを削除します


599

私はいくつかのディレクトリをコミットしてgithubにプッシュしました。その後、.gitignore無視すべきディレクトリを追加してファイルを変更しました。すべて正常に動作しますが、(現在は無視されます)ディレクトリはgithubに残ります。

githubとリポジトリ履歴からそのディレクトリを削除するにはどうすればよいですか?


回答:


1067

.gitignoreファイル内のルールは、追跡されていないファイルにのみ適用されます。そのディレクトリ下のファイルはすでにリポジトリでコミットされているため、ステージングを解除してコミットを作成し、GitHubにプッシュする必要があります。

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

リポジトリの履歴を書き換えずに履歴からファイルを削除することはできません。他の誰かがリポジトリを操作している場合や、複数のコンピュータから使用している場合は、この操作を行わないでください。それでもやりたい場合は、を使用git filter-branchして履歴を書き直すことができますここに役立つガイドがあります

さらに、出力はgit rm -r --cached some-directory次のようになることに注意してください。

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rmリポジトリについてのgitからのフィードバックです。ファイルはまだ作業ディレクトリにあります。


3
他の誰かがプルした場合、今は無視されたファイルがそれらのために削除されますか、それとも影響を受けませんか?
Martin Konicek 2012

3
@Martin Konicek:それらの変更をプルしているユーザーがそれらのファイルに変更を加えていない場合、それらは削除されます。
Mark Longair 2012

何@MarkLongair -r--cached。ありがとう。
Labanino 2014

13
@Labanino:-r再帰を意味し、ディレクトリ全体を実行する場合に必要です。--cached作業ディレクトリからそれらを削除するオーバーライドのgitのの正常な行動コミットのために削除をステージングし、Gitはコミットだけの準備ができてステージング領域で動作します。ファイルのローカルコピーを保持することをgitに指示する方法です。
entheh

2
これはうまくいきますが、私は最初にやらなければなりませんgit reset name_of_fileでした:上記のことを機能させるために
Edvard Haugland

248

私はこれをします:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

これはあなたのgit無視にあるすべてのファイル/フォルダを削除し、手動でそれぞれを選択する必要があることを保存します


これは私のために機能しなくなったようです、私は今やります:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

4
ありがとう、これは私を大いに助けてくれました!Windows PowerShellを使用している場合は、次のことを実行できますforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
マシュー

10
あなたの2番目のアプローチを試みました、それは私のローカルgitからすべてのファイルを削除しました!
artnikpro 2015年

2
私はあなたがサブディレクトリに移動してそれを行うことになっていると思います。私が間違っていたら訂正してください。

では、今日、私たちは何を学びましたか、子供たち?「スタックオーバーフローで見つけたランダムなコードを実行しないでください!」
ジョナサンランドラム

49

ここの私の回答に従って:Gitリポジトリからディレクトリを削除するにはどうすればよいですか?

ローカルからではなく、gitリポジトリからのみフォルダー/ディレクトリを削除するには、3つの簡単な手順を試してください。


ディレクトリを削除する手順

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

次のコミットでそのフォルダーを無視する手順

次のコミットからそのフォルダーを無視するには、ルートに.gitignoreという名前のファイルを1つ作成し 、そのフォルダー名をその中に入れます。好きなだけ置くことができます

.gitignoreファイルは次のようになります

/FolderName

ディレクトリを削除


1
これはまさに私が探していたものです。ありがとう:)
Rohit Singh

私はそれが@Rohit Singh
eirenaiosを

9

ブランデルの最初の答えは私にはうまくいきませんでした。しかし、それは私に正しい方法を示しました。私はこのように同じことをしました:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

以下のステートメントを実行して、最初に削除するファイルを確認することをお勧めします。

git ls-files -i --exclude-from=.gitignore

Visual Studioのデフォルトの.gitignoreファイルを使用していて、プロジェクトのすべてのログフォルダーとbinフォルダーが削除されており、これが意図したアクションではないことに気付きました。


5

注:このソリューションは、GithubデスクトップGUIでのみ機能します

使用することによりGithubのデスクトップGUIをそれは非常に簡単です。

  1. フォルダーを一時的に別の場所(プロジェクトフォルダーの外)に移動します。

  2. .gitignoreファイルを編集し、githubページのマスターリポジトリを削除するフォルダーエントリを削除します。

  3. プロジェクトフォルダをコミットして同期します。

  4. フォルダをプロジェクトフォルダに移動します

  5. .gitignoreファイルを再編集します。

それで全部です。


5

Blundellからの答えはうまくいくはずですが、奇妙な理由で私には関係ありませんでした。最初に最初のコマンドで出力されたファイル名をファイルにパイプし、そのファイルをループしてそのファイルを1つずつ削除する必要がありました。

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

4

この方法は、標準の.gitignore動作を適用し、無視する必要があるファイルを手動で指定する必要がありません

--exclude-from=.gitignoreもう使用できません:/-更新されたメソッドは次のとおりです:

一般的なアドバイス:クリーンなリポジトリから始めてください -すべてがコミットされ、作業ディレクトリまたはインデックスで何も保留されておらず、バックアップを作成してください!

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

新しく無視されたファイルをブランチのコミット履歴から削除する必要がある場合、または新しく無視されたファイルを今後のプルから削除したくない場合はこの回答を参照してください。


0

PowerShellから作業している場合は、以下を1つのコマンドとして試してください。

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

その後、git push --force --all

ドキュメント:https : //git-scm.com/docs/git-filter-branch


とのgit filter-branch違いはgit rm何ですか?最初はのバージョンを使用する必要があると思っていましたが、git filter-branchここでのほとんどのコメントはの使用を推奨していgit rmます。私が理解しgit rmていることから、現在の作業ディレクトリとインデックスからそれを削除するだけです。ただし、以前に複数のコミットを追加した場合は、リポジトリに残ります。
alpha_989 2018年

正しい。git rmファイルを最新のコミットから将来削除します。git filter-branch履歴全体から削除します。参照:help.github.com/articles/...
ショーンLuttin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.