2016-06-10 40 views
0

我在嘗試一個相當複雜的git歷史修剪,並未能找到與git filter-branch一起使用的命令。基本上我想刪除除了幾個匹配的文件和目錄之外的所有內容。git過濾分支內倒置的外殼通配

我想運行的命令實際上是

git filter-branch -f --prune-empty --tree-filter 'rm -rf ^(FileA.java|dirB)' HEAD 

git-filter-branch腳本barfs的括號。

/usr/local/Cellar/git/HEAD/libexec/git-core/git-filter-branch: eval: line 360: syntax error near unexpected token `(' 
/usr/local/Cellar/git/HEAD/libexec/git-core/git-filter-branch: eval: line 360: `rm -rf ^(FileA.java|dirB)' 
tree filter failed: rm -rf ^(FileA.java|dirB) 

我會一直期待eval處理嵌入式括號很好,但是這也超出我的shell/zsh的理解。

而且在git-filter-branch

if [ "$filter_tree" ]; then 
    git checkout-index -f -u -a || 
     die "Could not checkout the index" 
    # files that $commit removed are now still in the working tree; 
    # remove them, else they would be added again 
    git clean -d -q -f -x 
    eval "$filter_tree" < /dev/null || 
     die "tree filter failed: $filter_tree" 

回答

3
git filter-branch -f --index-filter ' 
     git read-tree --empty 
     git reset $GIT_COMMIT fileA.java dirB dirC 
' -- --all -- fileA.java dirB dirC 

曾經有問題的代碼看到觸及這些路徑的提交,並且(b)不檢查將永遠不會被檢查的內容。唯一需要--prune-empty的時間是當你要遇到或產生不會改變任何內容的提交時,rev-list參數(在第一個--之後)跳過所有這些。

0

仍然不確定爲什麼我不能得到這個與zsh的工作,所以使出了在bash腳本只包裹

$ cat ../purge.sh 
#!/bin/bash 
shopt -s extglob 
rm -rf -- !(FileA.java|dirB|dirC) 

$ git filter-branch -f --prune-empty --tree-filter '../purge.sh' HEAD