6

我有一个 SNMP 代理项目,与它一起开发了相关的 MIB 文件(*.smiv2 文件),但现在我希望它们在单独的 git 存储库中。

为了不丢失任何 MIB 文件历史记录,因为它们没有在现在的同一目录中启动,我不能只使用--subdirectory-filterfilter-branch,所以我尝试了--filter-index基于这个问题的方法。这个想法是删除每个不以结尾的文件.smiv2(显然是在原始项目的新克隆上,在过程结束时将被推送到我的新 MIB 存储库)。

为了使它更简单,我选择使用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以便它始终具有至少一个文件参数。

例如

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

xargs's -r|--no-run-if-empty flag might be cleaner:

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

于 2014-04-23T03:51:07.867 回答
3

Full Answer, for future reference

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 回答