リポジトリから特定の種類のファイルをすべて削除するにはどうすればよいですか?私は使っています
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
Gitがグロブを展開していないか、期待どおりに**
を展開していません。
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
動作するはずですが、git globs(*
)がパス区切り文字と一致するため、少しばかげています。したがって、**/*.jar
は*.jar
と同等です。
これは、*/a*.jar
がdir1/abc/dir2/log4j.jar
と一致することも意味します。 **/a*.jar
(任意のディレクトリで名前がa
で始まるすべてのjar)のようなものと一致させる場合は、findを使用する必要があります。以下は、名前がa
またはb
で始まるjar、およびdir1/dir2
内のjar、および任意のディレクトリ内の.txtファイルを削除するコマンドです。
git filter-branch --index-filter 'git rm -rf --cached "*.txt" "dir1/dir2/*.jar" $(find -type f -name "a*.jar" -o -name "b*.jar")'
参照:git help glossary
のpathspec
セクション。
すべてのjarをインデックスから削除するには、これを実行する必要があります。
git rm -r --cached **/*.jar
プロジェクトのルートディレクトリからこのコマンドを実行すると、クリーンアップされ、ステージング領域からのみすべてのファイルが削除されます。
私が見つけた最も簡単な方法は BFG Repo-Cleaner を使用することです
プロジェクトページの指示は明確です。使用するコマンドは次のようなものです。
bfg --delete-files "*.jar" my-repo.git
BFGは、.jar拡張子で終わるすべてのファイルのリポジトリの履歴を消去します。その後、結果をサーバーにプッシュする前に検査できます。
Git 2.24(2019年第4四半期)では、 git filter-branch
は非推奨です 。
同等のものは newren/git-filter-repo
、およびその サンプルセクション :
cd repo
git filter-repo --path-glob '*.jar' --invert-paths
これにより、jarファイルがリポジトリ履歴から削除されます。
これはgitコマンドではありませんが、Linuxマシンでそれを実現する方法に興味がある人は、
git ls-files | grep "\.sh$" | { while IFS= read -r line; do git rm --cached "$line"; done }
ここでは、gitインデックス内のすべてのファイルを一覧表示し、その出力をgrepコマンドに転送して、.sh
ファイルと、実行するファイルごとにgit rm --cached <file>
。