2011-09-12 102 views
13

我使用filter-branch的--subdirectory-filter選項拆分出一個Git存儲庫,除了將所有內容都提取到存儲庫的根目錄之外,它的工作很好。具有現有目錄結構的Git子目錄過濾器

我現在有

ABC 
    - DEF 
     - GHI 
     - JKL 
    - MNO 

而這個命令的結果:

git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all 

生成此:

GHI 
JKL 

當我真正想要的是這樣的:

ABC 
    - DEF 
     - GHI 
     - JKL 

我無法看到Git文檔中顯示保留(或設置)目錄結構的過濾器選項的任何內容,並且我無法找到命令,我可以在之後運行過濾以重新映射結構我想如何。

這可能嗎?

回答

3

我找到了一個答案here這是訣竅。

命令:

git filter-branch -f --index-filter 'git ls-files -s \ 
| sed "s-\t-&ABC/DEF/-" \ 
| GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \ 
&& mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' 

完美的作品

+1

工作對我來說也是完美的。感謝您發佈它。我應該補充說這個命令不會替代'--subdirectory-filter'命令;你仍然執行它。這個命令替換了其他文檔推薦的'git mv * ...'命令。但如果沒有醜陋的大規模提交,就會產生'git mv'。 –

+0

不幸的是,這並不適合我。我在Windows上運行git-bash,並且失敗說它找不到index.new($ GIT_INDEX_FILE.new)。我希望我可以使用這個解決方案。 –

+0

@BerinLoritsch $ GIT_INDEX_FILE是一個環境變量,我使用的大多數工具都爲你設置; MsysGit和CygWin以及幾個用於Windows替代品的git bash。你準確的設置是什麼? – JRoughan

1

我只給這個粗略的測試,不過我想你可以使用git filter-branch--tree-filter改寫分支,而是來自那些在子目錄ABC/DEF除了刪除所有文件,具有類似以下內容:

git filter-branch --tree-filter \ 
    'find . -path ./ABC/DEF -prune -o -type f -print0 | xargs -0 rm -f' \ 
    --prune-empty HEAD 

請注意,find命令只能刪除文件,而不是目錄,但由於git不存儲空目錄,所以這應該仍然會產生所需的結果。

+0

感謝您的。隨着這個倉庫的大小,我真的需要一些能夠處理索引的東西(索引過濾而不是樹過濾)。你的回答絕對是正確的,但在我的情況下會非常緩慢。我找到了答案,但我不確定接受我自己的答案的禮節,這可能適合大多數情況。 – JRoughan

+0

[回答你自己的問題是鼓勵](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/),如果它是解決的答案你的問題你也應該接受。不過,你必須[等待48小時](http://blog.stackoverflow.com/2009/01/accept-your-own-answers/)。我上面測試過的'--tree-filter'版本命令確實很慢,但通常使用filter-branch是一次性的,所以我不在乎是否必須讓它在一夜之間... –