2012-08-29 95 views
5

我有一個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' 

但我發現它非常醜陋笨重,所以我想問問是否有更直接/正確的方法來做到這一點。

+0

爲什麼不傳遞一個額外的從不存在的僞參數到'git rm --ignore-unmatched',例如, '| xargs rm --cached --ignore-unmatched DoesNotExistInMyProject'? –

+0

hehe ..完美@CharlesBailey,我怎麼看不到?你不想把它變成答案,所以我可以接受它嗎?謝謝! – Claudio

回答

7

最簡單的解決方案是將一個僞參數添加到git rm,以便它總是至少有一個文件參數。

E.g.

... | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject 
2

完整的答案,以供將來參考

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject' 
2

xargs-r | --no-run-if-empty標誌可能是清潔器:

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

0

一個-I開關也可以使用。

some command | xargs -I % rm % 
相關問題