作業中のgitリポジトリ内のリモートgitリポジトリをそのサブディレクトリとしてマージしたいと思います。結果のリポジトリに2つのリポジトリのマージされた履歴が含まれ、マージされたリポジトリの各ファイルがリモートリポジトリにあったときと同じように履歴を保持するようにしたいと思います。サブツリーマージ戦略の使用方法で説明したようにサブツリー戦略を使用しようとしましたが、その手順に従った後、結果のリポジトリには実際に2つのリポジトリのマージ履歴が含まれていますが、リモートリポジトリからの個々のファイルは履歴を保持していません(それらのいずれかの「gitlog」は「マージされたブランチ...」というメッセージを表示するだけです)。
また、2つの結合されたgitリポジトリを分離したくないので、サブモジュールを使用したくありません。
リモートgitリポジトリをサブディレクトリとして別のリポジトリにマージし、リモートリポジトリからの個々のファイルの履歴を保持することは可能ですか?
助けてくれてありがとう。
編集:私は現在、gitfilter-branchを使用してマージされたリポジトリ履歴を書き換えるソリューションを試しています。動作しているように見えますが、もう少しテストする必要があります。調査結果の報告に戻ります。
編集2:自分自身をより明確にするために、gitのサブツリー戦略で使用した正確なコマンドを指定します。これにより、リモートリポジトリのファイルの履歴が明らかに失われます。Aを現在作業しているgitリポジトリとし、BをそのサブディレクトリとしてAに組み込みたいgitリポジトリとします。それは次のことをしました:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
これらのコマンドの後、ディレクトリsubdir / Iwant / to / put / B / inに移動すると、Bのすべてのファイルが表示さgit log
れますが、いずれか1つに、「Bをsubdir / Iwant / to / putのサブディレクトリとしてマージ」というコミットメッセージのみが表示されます。 /置き場。" Bのファイル履歴は失われます。
どのようだ(私は私が間違っている可能性がありますのgitの初心者ですので)仕事には次のとおりであります:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
上記のfilter-branchのコマンドはgit help filter-branch
、から取得したもので、サブディレクトリパスのみを変更しました。
gitk
歴史について何と言っていますか?私は過去にgitサブツリーマージをうまく使用しました。おそらくあなたはあなたの正確なコマンドを明らかにすることができますか?git-filter-branchが正しいアプローチかどうかはわかりません。git-fast-exportとgit-fast-importを試して、新しい履歴を合成することをお勧めします。