2011-01-12 37 views
1

我有這種結構下單庫:混帳手術 - 拆分庫和修改目錄結構

my-repo/ 
    foo/ 
    contents-of-foo 
    bar/ 
    contents-of-bar 
    baz/ 
    contents-of-baz 
    other-contents 

我希望得到以下結構,理想情況下不會丟失任何歷史/標籤:

new-combined-repo/ 
    contents-of-foo 
    bar/ 
    contents-of-bar 
    baz/ 
    contents-of-baz 

my-other-repo 
    other-contents 

我對如何進行一個小卡住。我已經試過這樣:

$ pushd path/to/my-repo/ 
$ git mv bar foo/ 
$ git mv baz foo/ 
$ git commit -m "Move bar and baz prior to repository extraction" 
$ cd .. 
$ git clone --no-hardlinks my-repo new-combined-repo 
$ pushd new-combined-repo 
$ git remote rm origin 
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \ 
     --prune-empty -- --all 
$ git log --follow foo/bar/some-file 

這已經拋棄了所有的歷史記錄之前git mv命令some-file

更好的建議嗎? TIA。

回答

1

爲什麼不寫一個樹形過濾器(用於git filter-branch --tree-filter),該樹形過濾器可以刪除所有目錄,但是要保留那些目錄?像這樣的(未經測試):

#!/bin/bash 
shopt -s extglob dotglob 
rm -r !(bar|baz|.gitignore) 

這當然不會保存已移動到酒吧或巴茲文件的歷史記錄,但除此之外罕見的情況下,歷史將保持不變。

1
git filter-branch --tree-filter 'mv bar baz foo; rm *' 

請保存一份您的存儲庫的副本,然後再圍繞rm *亂搞。