Cla*_*dio 5 git git-filter-branch
我有一个SNMP代理项目,其中相关的MIB文件(*.smiv2文件)与它一起开发,但现在我想要它们在一个单独的git存储库中.
为了不丢失任何MIB文件历史,因为它们不是在现在的同一目录中启动,我不能只使用--subdirectory-filter
filter-branch,所以我尝试了--filter-index
基于这个问题的方法.这个想法是删除所有没有结束的文件.smiv2
(显然是在原始项目的新克隆上,在过程结束时将其推送到我的新MIBs回购).
为了简单起见,我选择使用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'
Run Code Online (Sandbox Code Playgroud)
我用过这个:
git filter-branch --prune-empty --index-filter 'git ls-files | \
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch'
Run Code Online (Sandbox Code Playgroud)
但是在第一次提交中任何一个都失败了,因为它看起来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
Run Code Online (Sandbox Code Playgroud)
我把它包装git rm
在脚本中,即使由于缺少参数而失败也会返回成功(保存在其中/usr/local/bin/gitrm_alt
):
#!/bin/sh
git rm --cached --ignore-unmatch "$@"
exit 0
Run Code Online (Sandbox Code Playgroud)
然后调用它而不是git rm
:
git filter-branch --prune-empty --index-filter 'git ls-files | \
grep -v ".smiv2$" | xargs gitrm_alt'
Run Code Online (Sandbox Code Playgroud)
但是我发现它非常丑陋和笨重,所以我想问一下是否有更直接/更合适的方法来做到这一点.
最简单的解决方案是添加一个伪参数git rm
,使其始终至少有一个文件参数.
例如
... | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject
Run Code Online (Sandbox Code Playgroud)
xargs
的-r
| --no-run-if-empty
标志可能更干净:
... | xargs
--no-run-if-empty
git rm --cached --ignore-unmatched
归档时间: |
|
查看次数: |
5853 次 |
最近记录: |