git rm-致命的:pathspecがどのファイルとも一致しませんでした


87

誤って9000枚以上の写真をプロジェクトフォルダに追加しました。そしてそれらをコミットしました。次に、それらをディスクから削除しました。関与する。

今、私は変更をgitサーバーにプッシュしようとしています。しかし、時間がかかりすぎて、12Gbのデータを送信しようとします。

ディスク上のファイルサイズを確認したところ、実際に確認できました .gitフォルダに12Gbかかる。

そこから写真を削除するにはどうすればよいですか?試しましたgit rmが失敗しました:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

私はすでにそれらをディスクから削除しましたが、それらはまだ.gitフォルダにあります。

私はに追加しようとしpublic/photosました.gitignore

public/photos/
*.zip

しかし、結果はありません。もちろんhard reset head、プロジェクトにジャンク写真があまりなかった瞬間もありました。しかし、それ以来、私は何度もコミットし、コードに多くの変更を加えました。

回答:


88

あなたの場合、のgit filter-branch代わりにを使用してくださいgit rm

git rm gitによって追跡されなくなるという意味でファイルが削除されますが、それらの画像に対応する古いコミットオブジェクトは削除されないため、12GBの画像に対応する以前のコミットをプッシュすることに固執します。

git filter-branch一方、以前のすべてのコミットからそれらのファイルを削除することができますだけでなく、このようにそれらのいずれかをプッシュする必要性を離れてやって。

  1. コマンドを使用する

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. フィルタブランチが完了したら、意図しないファイルが失われていないことを確認します。

  3. 次に、.gitignoreルールを追加します

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. 今プッシュを行います

    git push -f origin branch
    

さらにヘルプが必要な場合は、これこれ、およびこれを確認してください。安全のために、これらの手順を実行する前に、システムにリポジトリのバックアップコピーを作成することをお勧めします。

元のエラーメッセージについてはgit rm、を使用して既に追跡を解除しているために発生しているため、追跡していないファイルを削除できないため、gitは文句を言います。読む本についての詳細をここに


2
ねえ、私は同じ問題を抱えていますが、ステップ1でコマンドを入力すると、エラーが発生します:致命的:不正なリビジョン '--prune-empty'。どんな手掛かり?
ケビン2014年

@kevin申し訳ありませんが、このコメントを逃しました。そのフラグなしで実行できます。プルーニングにより、空のコミットオブジェクトが削除されます。
ムー無

1
この行はすべきではありませんgit add .gitignore && commit -m "ignore rule for photos"git add .gitignore && git commit -m "ignore rule for photos"
2015

はい@Clone、今それを修正している、ということであったはず:)
ムー無

1
これはめちゃくちゃ素晴らしい答えです。リポジトリで数年間発生している問題を修正しました。ありがとう!
モシェ

18

非常に簡単な答えはです。

ステップ1:

まず、削除する追跡されていないファイルを追加します。

git add .またはを使用しgit add <filename>ます。

ステップ2:

次に、git rm -f <filename>ここでコマンドrm = removeおよび-f = forcelyを使用して簡単に削除します。


これは、以前のコミットに存在するファイルを削除するというOPが望んでいることを実行しません。git filter-branch他の場所で述べたように使用する必要があります。
サイモンスティーブンス

9

ステップ1

ファイル名をファイルに追加します.gitignore

ステップ2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

ステップ3

git push -f origin branch

@muに感謝します。


7
...私はいつもgitがそれを証明するはずよりも難しいと思っていました。フラグや癖は言うまでもなく、ほとんどのgitコマンドの存在を誰もが思い出すことができる方法はありません。Gitモデルは理にかなっており、単純なフローに従うまで機能します。スタックするとすぐに、ハードにスタックします。
Muhammad Umer 2016

2
これは私のために働く解決策です、私は必要でした--ignore-unmatch
guhur 2018年


1

私の場合、このチェーンは機能します。

  1. git rm -r WebApplication/packages

確認のgit-dialogがありました。「y」オプションを選択する必要があります。

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

仕事をしました、それは私がrm代わりに使用して削除したファイルを復元しましたgit rm

最初に最後のハッシュをチェックアウトしましたが、必須ではないと思います。


0

追跡された古いコミット済みファイルをgitから削除するには、以下のコマンドを使用できます。ここで私の場合、distディレクトリからすべてのファイルを追跡解除して削除したいと思います。

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

次に、それをに追加して、.gitignoreそれ以上追跡されないようにする必要があります。


-1

重複するディレクトリ(〜web / web)がありrm -rf web、最初のWebフォルダ内で実行すると、ネストされた重複が削除されました。


ごめんなさい!私はその質問を読み間違えたに違いない。私はそれが目標だったものだと思った
ccsinsf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.