2017-10-13 95 views
0

假設我有一個文件夾結構是這樣的一個倉庫:如何`git filter-branch`多個子目錄並保留其父目錄?

|-dir1 
|-dir2 
| |-subdir1 
| |-subdir2 
| |-subdir3 
|-dir3 

我希望我可以簡單地git filter-branch --subdirectory-filter我的出路,但我似乎遇到兩個難題:

  • 它似乎我不能提供多個--subdirectory-filter參數?至少它似乎沒有包含我想要的所有子目錄。
  • git似乎剝離父目錄。

所以,我該怎麼辦,如果我想我的過濾回購得到這個結果?:

|-dir1 
|-dir2 
| |-subdir1 
| |-subdir3 

增加:

正如意見建議,我曾嘗試:

git filter-branch --tree-filter 'rm -rf dir2/subdir2' --prune-empty 

但這很慢,所以我對此感到不耐煩。 git help filter-branch似乎表明,我可以使用的--index-filter代替--tree-filter,使其更快,所以我希望我可以簡單地這樣做,而不是:

git filter-branch --index-filter 'rm -rf dir2/subdir2' --prune-empty 

然而,儘管它似乎通過我提交合作,並做一些它與消息結束:

警告:REF「裁判/頭/主」是不變的

和「DIR2 /子目錄」,其內容仍是我的工作拷貝。所以我明顯誤解了一些東西。我很好奇--index-filter可能是正確的方式嗎?

+1

我認爲你需要'git filter-branch --tree-filter'rm -rf dir2/subdir2 dir3 /''。如果需要,加'-f'。 – ElpieKay

+0

@ElpieKay我會試一試 –

+0

@ElpieKay'--tree-filter'需要永久使用,所以我嘗試使用'--index-filter'來代替,因爲各種來源似乎都表明這應該會有相同的效果。但是,儘管重寫提交非常繁忙,但它對我的實際工作副本沒有任何影響,並且也以消息結尾**警告:Ref'refs/heads/master'不變**。我可能做錯了什麼? –

回答

1

這是事實問題:

git filter-branch --index-filter 'rm -rf dir2/subdir2' --prune-empty 

指數濾波器必須在Git的指數操作(也稱爲暫存區緩存,取決於您正在查看哪些特定的Git文檔)。

幸運的是,對於這種特殊情況下有一個Git命令相當於rm -rf,經營(只)在Git的指數:

git rm --cached -rf --ignore-unmatch dir2/subdir2 

我們需要--cached部分,使其只對指數的工作, -r使其表現得像rm -r-f --ignore-unmatch使其表現如同rm -f。因此,全濾波器分支命令至少是:

git filter-branch \ 
    --index-filter 'git rm --cached -rf --ignore-unmatch dir2/subdir2' \ 
    --prune-empty 

(您可能需要添加--tag-name-filter cat和/或其他過濾器分支選項。)

(過濾器分支指令是全小怪癖因爲它必須複製提交它的「過濾器」,這是非常緩慢的。--tree-filter是最簡單的使用,因爲它適用於所有正常的文件系統操作,但它也是最慢的。)

相關問題