78

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

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

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

4

3 に答える 3

125

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

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: forever remove files or folders from history

別のリンクには多くの説明があります:機密データの削除

[編集]また、この 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
于 2011-04-06T08:39:14.040 に答える
9

ブランチ全体をリベースして、画像を追加したコミットとそれらを削除したコミットの両方を削除できます。

git rebase -i master

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

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

編集: これは、リモート リポジトリにプッシュした場合でも機能しますが、--force を使用してプッシュする必要があります。(同じことが git filter-branch ソリューションにも当てはまります)。

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


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

于 2011-04-06T11:17:09.507 に答える