2016-08-10 11 views
2

インデックスから特定の種類のファイルをすべて削除するにはどうすればよいですか?私はGit - インデックスから特定の種類のファイルをすべて削除する

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

を使用しているいずれかのgitがグロブを拡大していない、またはそれは私が期待していた方法で**を拡大していません。

+0

インデックスから削除するか、レポを作成しますか? filter-branchはあなたのrepoを "クリーン"にします – CodeWizard

答えて

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

は動作するはずですが、Gitのグロブ(*)は、パスの区切りと一致するので、それは少し愚かです。したがって、**/*.jar*.jarに相当します。

*/a*.jarは、dir1/abc/dir2/log4j.jarと一致します。 **/a*.jar(すべてのディレクトリにあるaで始まるすべてのjars)と一致するようにしたい場合は、findを使用する必要があります。ここでdir1/dir2に名前aまたはbで始まる任意のjarファイル、および任意の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セクション。

5

あなたは単にインデックスからすべてのjarファイルを削除するために、これを実行する必要があります。プロジェクトのルートディレクトリから

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

実行このコマンドを、それがクリーンアップされますとだけ、すべてのファイルを削除しますステージングエリアから。

+1

何が '**'を展開しますか? Bash(または他のシェル)かgit? 'index-filter'はコードをチェックアウトしないので、ここではbash拡張は役に立ちません。 –

+0

私が正しく理解していれば、gitでは '*'はパス区切りに一致するため、 '**'はそこには必要ありません。 ( 'git help glossary'の' pathspec'を参照してください)。 –

1

それは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>を実行します。

2

私が見つけた最も簡単な方法は、プロジェクトのページの指示が明確であるBFG Repo-Cleaner

を使用することです。あなたが使用するコマンドは、次のようなものです:

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

BFGは.jar拡張子で終わるすべてのファイルの履歴を消去します。結果をサーバーに戻す前に検査することができます。

関連する問題