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

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

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

442

7 答え

.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からのフィードバックです。ファイルはまだ作業ディレクトリにあります。

788
追加された
@MarkLongair -r- キャッシュは何をしますか?ありがとう。
追加された 著者 Labanino,
@Martin Konicek:これらの変更を引き出すユーザーがこれらのファイルに変更を加えていない場合、それらは削除されます。
追加された 著者 Mark Longair,
誰か他の人が引っ張っても、今無視されているファイルは削除されますか?
追加された 著者 Martin Konicek,
@Labanino: -r は、ディレクトリ全体を操作する場合に必要な再帰的な処理を意味します。 - キャッシュは、gitの通常の動作を上書きして、コミットのために削除をステージングする作業ディレクトリから削除し、gitをコミットの準備ができたステージング領域でのみ動作させる。 gitにファイルのローカルコピーを保存したいと言う方法です。
追加された 著者 entheh,
これはうまくいきましたが、私は最初にやっていなければなりません:上で説明した作業のために git reset name_of_file
追加された 著者 Edvard Haugland,

私はこれをします:

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 ignoreにあるすべてのファイル/フォルダを削除します。保存すると、手動でそれぞれを選択する必要があります


これは私のために働いていないようだ、私は今:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master
203
追加された
ありがとう、これは私をたくさん助けました! Windows PowerShellを使用している場合は、 foreach($ iをiex 'git ls-files -i --exclude-from = .gitignore'){git rm --cached $ i}
追加された 著者 Matthew,
あなたの2番目のアプローチを試して、それは私のローカルのgitからすべてのファイルを削除!
追加された 著者 artnikpro,
私はあなたがサブディレクトリに移動してそれをやるべきだと思う。私が間違っているなら私を訂正してください。
追加された 著者 user4414636,

As per my Answer here: How to remove a directory from git repository?

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


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

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

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

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

.gitignore file will be look like this

/FolderName

remove directory

32
追加された
@ VSG24はうれしい!
追加された 著者 eirenaios,
@Leniel Macaferi:D
追加された 著者 eirenaios,
これが答えです。 (2016年7月現在)
追加された 著者 VSG24,
よくやった...これは私が探していたものだった。 :)ありがとう!
追加された 著者 Leniel Macaferi,
良い人、魅力的な仕事をした。
追加された 著者 Cathal,

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
追加された

Blundellの最初の答えは私にとってはうまくいかなかった。しかしそれは私に正しい方法を示しました。私はこのように同じことをした:

> 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フォルダを削除していたことに気付きました。

4
追加された

注:このソリューションは、 Github Desktop GUI でのみ機能します。

Github Desktop GUI を使うことで、非常に簡単です。

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

  2. .gitignore ファイルを編集し、githubページのマスターリポジトリを削除するフォルダエントリを削除します。
  3. プロジェクトフォルダをコミットして同期します。

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

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

それで全部です。

2
追加された
私はそれが好きです - シンプルで簡単です。
追加された 著者 Radmation,

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 を押します。

Documentation: https://git-scm.com/docs/git-filter-branch

0
追加された
右。 git rm は、最新のコミットからファイルを削除します。 git filter-branch で履歴全体から削除できます。以下も参照してください: help.github.com/articles/…
追加された 著者 Shaun Luttin,
git filter-branchgit rm とどう違うのでしょうか?元々、 git filter-branch のバージョンを使用しなければならないと思っていましたが、ここでのほとんどのコメントは git rm を使用することをお勧めします。私が理解しているところでは、 git rm は現在の作業ディレクトリとインデックスからのみ削除します。しかし、以前に複数回追加された場合、それはまだリポジトリに残ります。
追加された 著者 alpha_989,