2011-01-12 3 views
1

を変更:gitの手術 - 私はこのような構造では、次の単一のリポジトリを持っているリポジトリを分割し、ディレクトリ構造

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 

私は続行する方法について少しこだわっています。私はこれを試してみた:前git mvコマンドにsome-fileのすべての歴史を落とした

$ 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 

もっと良い提案ですか? 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 *あなたの周り混乱する前に、リポジトリのコピーをしてください保存しています。

関連する問題