web-dev-qa-db-ja.com

Gitリポジトリから完全にファイルを削除し、GitHubでリモート

誤って画像のフォルダーを追加してコミットしました。次に、もう1つコミットしました。次に、git rm -f ./imagesを使用してこれらのファイルを削除し、再度コミットしました。

今、私はそのブランチ(マスター)でさらに多くのコミットを行いました。 HEADには、その./static/imagesフォルダーがありません。

これにより、レポのサイズが大幅に増加しました。これらのBLOBを完全に削除するにはどうすればよいですか?そして、リモートのGitHubリポジトリからも削除したいと思います。

76

これはあなたが探しているものです: 無視してもファイルは削除されません 。そのページを読むことをお勧めしますが、使用する特定のコマンドは次のとおりです。

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

また、gitが作成するキャッシュから削除されたすべてのファイルを削除するには、次を使用します。

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --Prune

最後のコマンドの詳細と、1つのアクションで必要なすべてを実行するスクリプトについては、こちらをご覧ください。 git:履歴からファイルまたはフォルダーを永久に削除

説明がたくさんある別のリンク: 機密データの削除

[編集]また、このStackOverflowの質問を参照してください: Git履歴から機密ファイルとそのコミットを削除します

(上記の質問のnatacadoの回答からコピーされたコマンド。)作業コピーからファイルを既に削除している場合、以下が機能するはずです。不要なファイルを追加したコミットのハッシュを見つけます。それから:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git Push --force --verbose --dry-run
git Push --force
124
Darhuuk

ブランチ全体をリベースし、イメージを追加したコミットとイメージを削除したコミットの両方を削除することができます。

git rebase -i master

コミットのリストが表示されます。削除する不正なコミットがある行を削除します。 (「dd」はデフォルトのエディターであるvimの行を削除します。その後、ZZで保存します)

その後、ダングリングコミットは、自然なgitガベージコレクションの過程でクリーンアップされます。これは、Darhuukの回答で指定されたコマンドを使用して強制できます。

編集:リモートリポジトリにプッシュした場合でも機能しますが、-forceでプッシュする必要があります。 (gitフィルター分岐ソリューションにも同じことが当てはまります)。

これは、ブランチからプルした人​​にとっては非常に迷惑なことに注意してください。 "アップストリームリベースからの回復" を参照する必要があります。


おそらく、元の偶発的な画像の追加は、維持したいコミットの一部です。この場合、リベース中にコミットを編集して、保持したい部分を分割する必要があります。これを行うには、そのコミットの「rebase -i」リストの「pick」を「e」(編集用)に置き換えます。リベースプロセスはここで停止し、「git commit --amend」でコミットを分割できます。

9
RJFalconer

私は本質的に繰り返します 答え これと組み合わせて Windowsのフォーマットに関する警告 、それがコメントとして失われないようにするためだけです。

文字列の解析方法を使用しているシェルに依存するため、一重引用符ではなく二重引用符の使用に注意してください。

単線:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

複数行:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD
3
drzaus