関連するMIBファイル(* .smiv2ファイル)が一緒に開発されたSNMPエージェントのプロジェクトがありますが、今は別のgitリポジトリにそれらが必要です。
MIBファイルの履歴を失わないようにするために、MIBファイルは現在の同じディレクトリで開始されなかったため、--subdirectory-filter
フィルターブランチを使用することはできなかったため、この質問--filter-index
に基づいてアプローチを試みました。アイデアは、で終わらないすべてのファイルを削除することです(明らかに、元のプロジェクトの新しいクローンで、プロセスの終わりまでに新しいMIBリポジトリにプッシュされます)。.smiv2
簡単にするために、次の代わりにls-files
overを使用することを選択しました。ls-tree
git filter-branch --prune-empty --index-filter 'git ls-tree -r --name-only \
--full-tree $GIT_COMMIT | grep -v ".smiv2$" | xargs git rm --cached \
--ignore-unmatch -r'
私はこれを使用しました:
git filter-branch --prune-empty --index-filter 'git ls-files | \
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch'
しかし、これらのいずれも最初のコミットで失敗しました。git rm
引数がまったく与えられていないように見えるためです(指定--ignore-unmatch
された引数が見つからない場合は正常に機能すると思いますが、引数が指定されていない場合は機能しません)。
$ git filter-branch --prune-empty --index-filter 'git ls-files | \
> grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch'
Rewrite 4cd2f1c98dbaa96bc103ae81fbd405bd1d991d9a (1/418)usage: git rm [options] [--] <file>...
-n, --dry-run dry run
-q, --quiet do not list removed files
--cached only remove from the index
-f, --force override the up-to-date check
-r allow recursive removal
--ignore-unmatch exit with a zero status even if nothing matched
index filter failed: git ls-files | \
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch
git rm
引数がないために失敗した場合でも成功を返すスクリプトでラップして動作させました(に保存しました/usr/local/bin/gitrm_alt
):
#!/bin/sh
git rm --cached --ignore-unmatch "$@"
exit 0
代わりにそれを呼び出しgit rm
ます:
git filter-branch --prune-empty --index-filter 'git ls-files | \
grep -v ".smiv2$" | xargs gitrm_alt'
しかし、私はそれが非常に醜くて不格好であることに気づいたので、これを行うためのより直接的で適切な方法があるかどうか尋ねたいと思います。