clone して filter-branch を使うと、サブディレクトリを別のリポジトリにできます。
例えば、/tmp/hoge にあるリポジトリに hoge と subdir/foo と言うファイルがあって、ログが以下とすると、
% git log -p --pretty=oneline ac27f0a1f18108cd81be52634b07228c6bb95a0b Added foofoo diff --git a/subdir/foo b/subdir/foo index 257cc56..b4c9d55 100644 --- a/subdir/foo +++ b/subdir/foo @@ -1 +1,2 @@ foo +foofoo a6cc83ca5cec477444f0d63359ef12dede648eb5 Added hogehoge diff --git a/hoge b/hoge index 2262de0..1904c09 100644 --- a/hoge +++ b/hoge @@ -1 +1,2 @@ hoge +hogehoge 2cc5231bf25e8dac21d81cb6cf86edff33edeef7 Initial commit diff --git a/hoge b/hoge new file mode 100644 index 0000000..2262de0 --- /dev/null +++ b/hoge @@ -0,0 +1 @@ +hoge diff --git a/subdir/foo b/subdir/foo new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/subdir/foo @@ -0,0 +1 @@ +foo
subdir を別のリポジトリにするには以下のようにします。
% cd .. % git clone hoge subdir Initialized empty Git repository in /private/tmp/subdir/.git/ % cd subdir % git filter-branch --subdirectory-filter subdir HEAD Rewrite ac27f0a1f18108cd81be52634b07228c6bb95a0b (2/2) Ref 'refs/heads/master' was rewritten
すると、以下のように subdir に関するコミットだけが集まって,いい感じのリポジトリが出来ます。
% git log -p --pretty=oneline aa07bd514d687f8123978756b8b106fc9b284576 Added foofoo diff --git a/foo b/foo index 257cc56..b4c9d55 100644 --- a/foo +++ b/foo @@ -1 +1,2 @@ foo +foofoo 20f6eb9cdc5add3c37044dfedc98a4618d7c8e82 Initial commit diff --git a/foo b/foo new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/foo @@ -0,0 +1 @@ +foo
後はこいつをbareリポジトリにpush!
ちなみに、この手順を試したければ以下のようにhogeリポジトリを作るといいです。
% cd /tmp % mkdir hoge % cd hoge % git init Initialized empty Git repository in /private/tmp/hoge/.git/ % mkdir subdir % echo 'hoge' > hoge % echo 'foo' > subdir/foo % git add . % git commit -m 'Initial commit' [master (root-commit)]: created 2cc5231: "Initial commit" 2 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 hoge create mode 100644 subdir/foo % echo 'hogehoge' >> hoge % git commit -am 'Added hogehoge' [master]: created a6cc83c: "Added hogehoge" 1 files changed, 1 insertions(+), 0 deletions(-) % echo 'foofoo' >> subdir/foo % git commit -am 'Added foofoo' [master]: created ac27f0a: "Added foofoo" 1 files changed, 1 insertions(+), 0 deletions(-)