我有一個SNMP代理的項目,其中相關的MIB文件(* .smiv2文件)與它一起開發,但現在我想他們在一個單獨的git倉庫。正確的方法來刪除不需要的文件與git過濾分支沒有git rm失敗
爲了不丟掉任何一個MIB文件的歷史,因爲他們沒有在他們現在是同一個目錄開始,我不能只使用--subdirectory-filter
過濾分支,所以我嘗試了--filter-index
方法的基礎上, this question。這個想法是刪除每一個不以.smiv2
結尾的文件(顯然是在原始項目的新克隆中,在進程結束時將被推送到我的新MIB庫)。
,使其更簡單,我選擇了用ls-files
超過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 "[email protected]"
exit 0
,然後調用,與其git rm
:
git filter-branch --prune-empty --index-filter 'git ls-files | \
grep -v ".smiv2$" | xargs gitrm_alt'
但我發現它非常醜陋笨重,所以我想問問是否有更直接/正確的方法來做到這一點。
爲什麼不傳遞一個額外的從不存在的僞參數到'git rm --ignore-unmatched',例如, '| xargs rm --cached --ignore-unmatched DoesNotExistInMyProject'? –
hehe ..完美@CharlesBailey,我怎麼看不到?你不想把它變成答案,所以我可以接受它嗎?謝謝! – Claudio