6

関連するMIBファイル(* .smiv2ファイル)が一緒に開発されたSNMPエージェントのプロジェクトがありますが、今は別のgitリポジトリにそれらが必要です。

MIBファイルの履歴を失わないようにするために、MIBファイルは現在の同じディレクトリで開始されなかったため、--subdirectory-filterフィルターブランチを使用することはできなかったため、この質問--filter-indexに基づいてアプローチを試みました。アイデアは、で終わらないすべてのファイルを削除することです(明らかに、元のプロジェクトの新しいクローンで、プロセスの終わりまでに新しいMIBリポジトリにプッシュされます)。.smiv2

簡単にするために、次の代わりにls-filesoverを使用することを選択しました。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'

しかし、私はそれが非常に醜くて不格好であることに気づいたので、これを行うためのより直接的で適切な方法があるかどうか尋ねたいと思います。

4

4 に答える 4

8

最も簡単な解決策は、にダミーの引数を追加しgit rmて、常に少なくとも1つのファイルパラメータを持つようにすることです。

例えば

... | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject
于 2012-08-29T20:18:49.417 に答える
5

xargs-r| --no-run-if-emptyフラグはよりクリーンかもしれません:

... | xargs--no-run-if-emptygit rm --cached --ignore-unmatched

于 2014-04-23T03:51:07.867 に答える
3

将来の参考のために、完全な答え

git filter-branch --prune-empty --index-filter 'git ls-files | \
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject'
于 2014-04-23T03:44:51.353 に答える
0

-Iスイッチも使用できます。

some command | xargs -I % rm % 
于 2015-02-12T05:26:29.347 に答える