読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Gitリポジトリ中のサブディレクトリを別のリポジトリにする

git

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(-)

2010-2-19 追記

higeponさんもハマってたみたいなのでTB。

Pro Gitにも書いてます。