インデックスから特定の種類のファイルをすべて削除するにはどうすればよいですか?私はGit - インデックスから特定の種類のファイルをすべて削除する
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
を使用しているいずれかのgitがグロブを拡大していない、またはそれは私が期待していた方法で**
を拡大していません。
インデックスから特定の種類のファイルをすべて削除するにはどうすればよいですか?私はGit - インデックスから特定の種類のファイルをすべて削除する
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
を使用しているいずれかのgitがグロブを拡大していない、またはそれは私が期待していた方法で**
を拡大していません。
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 glossary
のpathspec
セクション。
あなたは単にインデックスからすべてのjarファイルを削除するために、これを実行する必要があります。プロジェクトのルートディレクトリから
git rm -r --cached **/*.jar
実行このコマンドを、それがクリーンアップされますとだけ、すべてのファイルを削除しますステージングエリアから。
何が '**'を展開しますか? Bash(または他のシェル)かgit? 'index-filter'はコードをチェックアウトしないので、ここではbash拡張は役に立ちません。 –
私が正しく理解していれば、gitでは '*'はパス区切りに一致するため、 '**'はそこには必要ありません。 ( 'git help glossary'の' pathspec'を参照してください)。 –
それは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>
を実行します。
私が見つけた最も簡単な方法は、プロジェクトのページの指示が明確であるBFG Repo-Cleaner
を使用することです。あなたが使用するコマンドは、次のようなものです:
bfg --delete-files "*.jar" my-repo.git
BFGは.jar拡張子で終わるすべてのファイルの履歴を消去します。結果をサーバーに戻す前に検査することができます。
インデックスから削除するか、レポを作成しますか? filter-branchはあなたのrepoを "クリーン"にします – CodeWizard