web-dev-qa-db-ja.com

Git-リポジトリから特定のタイプのファイルをすべて削除します

リポジトリから特定の種類のファイルをすべて削除するにはどうすればよいですか?私は使っています

git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

Gitがグロブを展開していないか、期待どおりに**を展開していません。

12
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

動作するはずですが、git globs(*)がパス区切り文字と一致するため、少しばかげています。したがって、**/*.jar*.jarと同等です。

これは、*/a*.jardir1/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 glossarypathspecセクション。

6

すべてのjarをインデックスから削除するには、これを実行する必要があります。

git rm -r --cached **/*.jar

プロジェクトのルートディレクトリからこのコマンドを実行すると、クリーンアップされ、ステージング領域からのみすべてのファイルが削除されます。

14
CodeWizard

私が見つけた最も簡単な方法は BFG Repo-Cleaner を使用することです

プロジェクトページの指示は明確です。使用するコマンドは次のようなものです。

bfg --delete-files "*.jar"  my-repo.git

BFGは、.jar拡張子で終わるすべてのファイルのリポジトリの履歴を消去します。その後、結果をサーバーにプッシュする前に検査できます。

5
JoshOfAllTrades

Git 2.24(2019年第4四半期)では、 git filter-branchは非推奨です

同等のものは newren/git-filter-repo 、およびその サンプルセクション

cd repo
git filter-repo --path-glob '*.jar' --invert-paths

これにより、jarファイルがリポジトリ履歴から削除されます。

1
VonC

これは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>

1
Viktor K