2011-07-09 11 views
8

私はリポジトリを持っており、そのディレクトリの1つを新しいリポジトリに切り離したいと思います。 Thisは始めるには最適な場所ですが、1つの注意点があります。私が切り離したいディレクトリは、ある時点で名前が変更されました。そして、私がディレクトリの新しい名前でそのポストからの解決に従うならば、私は再命名の前に歴史を失っているようです。この状況で動作させるための調整のアイデアはありますか?サブディレクトリ(名前が変更されました!)を新しいリポジトリに追加

答えて

9

git filter-branchはコミットの範囲で動作できます。私たちは何ができるか「前」と別に「の後」をフィルタリングし、それらを一緒にタックするために移植片を使用している:

git branch rename $COMMIT_ID_OF_RENAME 
git branch pre-rename rename~ 
## First filter all commits up to rename, but not rename itself 
git filter-branch --subdirectory-filter $OLDNAME pre-rename 
## Add a graft, so our rename rev comes after the processed pre-rename revs 
echo `git rev-parse rename` `git rev-parse pre-rename` >> .git/info/grafts 
## The first filter-branch left a refs backup directory. Move it away so the 
## next filter-branch doesn't complain 
mv .git/refs/original .git/refs/original0 
## Now filter the rest 
git filter-branch --subdirectory-filter $NEWNAME master ^pre-rename 
## The graft is now baked into the branch, so we don't need it anymore 
rm .git/info/grafts 

これは、あなたが複数のブランチやタグをフィルタリングする必要がある場合は、わずかに、より複雑です。名前変更前のブランチは最初のフィルタブランチに含めることができ、後のブランチは2番目のフィルタブランチの^renameの前に含める必要があります。

もう1つの方法として、インデックスのフィルタ(またはツリーフィルタ)を追加し、oldとnewの両方のディレクトリをチェックし、いずれかが存在するかどうかを調べる方法があります。

テスト・リポジトリを提供していないので、ここでは迅速な健全性チェックのスクリプトは、このシナリオのためです:

#!/bin/bash 

set -u 
set -e 
set -x 

rm -rf .git x y foo 

git init 
mkdir x 
echo initial > x/foo 
git add x/foo 
git commit -m 'test commit 1' 

echo tc2 >> x/foo 
git commit -a -m 'test commit 2' 

mv x y 
git rm x/foo 
git add y/foo 
git commit -a -m 'test rename' 

git branch rename HEAD 

echo post rename >> y/foo 
git commit -a -m 'test post rename' 

git branch pre-rename rename~ 

git filter-branch --subdirectory-filter x pre-rename 
echo `git rev-parse rename` `git rev-parse pre-rename` >> .git/info/grafts 

mv .git/refs/original .git/refs/original0 

git filter-branch --subdirectory-filter y master ^pre-rename 

rm .git/info/grafts 

git log -u 

この手順は、あなたのために動作しない場合は、奇数何か他のものがありそうです履歴に隠されている別の名前の変更など、記述していないリポジトリ履歴について

+0

うーん、私は(私は何も知らなかった)移植片であなたの方法を試してみましたが、それは私のために動作しませんでした。 "前"コミットの1つを処理した後は空になり、別のもののファイルはそのレポのルートに移動しました。私はそれを理解できません。 私はツリーフィルタを使用する前に考えていましたが、それについての経験はありません。私はいくつかの指針を見せてくれますか? – akoprowski

+0

コミット前に正しいサブディレクトリが使用されていますか?どこかでgit repoを投稿できますか? – bdonlan

+0

うん、名前変更はその直前に名前を変更して名前を変更したコミットにあった。レポは巨大で部分的にプライベートなのでどこにでも公開することはできません: – akoprowski

関連する問題