2017-01-23 6 views
0

まず、この質問をするためのお詫びです。すでに多くの話題があります。しかし、私はそれらに多くの運がない。私のgitに精通していない私はあまり役に立たない。gitは、履歴を保存しながら別のリポジトリにディレクトリを移動します。

私はgit repoから別のgit repoにフォルダを移動しています(既に存在しています)。例えば最後に

repo-1 
---- dir1 
---- dir2 
---- dir3 
---- dir-to-move 
---- dir5 

repo-2 
---- dir1 
---- dir2 
---- dir3 

私はレポがDIRツー移動は両方のリポジトリ内に存在する時間について

repo-1 
---- dir1 
---- dir2 
---- dir3 
---- dir-to-move 
---- dir5 

repo-2 
---- dir1 
---- dir2 
---- dir3 
---- dir-to-move 

すなわち見えるようにしたいです。しかし、最終的に最新の変更をrepo-2に移行し、からrepo-1に移動します。

私の最初の研究は、フィルターブランチを使用する必要があると私に信じさせました。例えば

How to move files from one git repo to another preserving history using `git format-patch`and `git am`

私は以来サブツリーはそのアプローチを取っていることを学びました。しかし、それは私が期待したことをしていない。私はがダウンのみDIRツー移動から枝を分割し、それが歴史だフィルタリングするレポ-1ワークスペース

git subtree split -P dir-to-move -b split 

ような何かを行うことができるだろうと思っていました。 そしてワークスペースレポ2

git remote add repo-1 repo-1-url.git 
git subtree add --prefix dir-to-move split 

これは両端のコードを移動しません。それはまた、種類の、歴史を含む

例えば、

cd repo-2 
git log 

ショーがレポ-1

しかし

cd repo-2 
git log dir-to-move 

からコミットのみ表示 'DIR-への移行コミットからの追加....'

すなわち履歴は含まれていますが、特定のファイル/ディレクトリがチェックされていると表示されません。

これを正しく行うにはどうすればよいですか?

+0

をマスターGitは、ディレクトリの移動を追跡するために失敗したように見えます。ディレクトリの代わりにファイルを指定した場合は、その移動に従いますか? – max630

答えて

2

私はgit subtreeでお手伝いできませんが、filter-branchで可能です。

まず、ソースブランチとデスティネーションブランチの両方を含む共通リポジトリを作成する必要があります。これは、「原点」の横に新しい「リモート」を追加し、新しいリモートからフェッチすることで実行できます。

ソースブランチのfilter-branchrm -rfに、dir-to-move以外のすべてのディレクトリを使用してください。その後、完全に元のブランチにリベースまたはマージすることができるコミット履歴が作成されます。私は最も簡単な方法は、ソースブランチから空でないすべてのコミットをcherry-pickにすることだと思います。 dir-to-moveの歴史は非直線的である場合には、これらのコミットのリストが、それはチェリーピックによって保存されることはありませんので、git mergeをすることができ、(すでにコミットをマージ含まれている)、もちろんgit rev-list --reverse source-branch -- dir-to-move

を実行することによって得ることができます代わりに使用されます。

例共通レポを作成します。

cd repo-2 
git remote add source ../repo-1 
git fetch source 

例のフィルタ分岐

cd repo-2 
git checkout -b source-master source/master 
CMD="rm -rf dir1 dir2 dir3 dir5" 
git filter-branch --tree-filter "$CMD" 

例桜ピック先に

cd repo-2 
git checkout master 
git cherry-pick `git rev-list --reverse source-master -- dir-to-move` 
+0

唯一の解決策であるようです。私はここのアプローチに従ったhttp://blog.mattsch.com/2015/06/19/move-directory-from-one-repository-to-another-preserving-history/ –

関連する問題