[解決済み】ファイル履歴を壊さずに2つのGitリポジトリをマージする
質問
2 つの Git リポジトリをマージして、新しい 3 つ目のリポジトリを作成する必要があります。 サブツリーのマージを使った方法がたくさん紹介されています(たとえば
Jakub Narębskiの回答
について
二つの Git リポジトリをマージする方法は?
) を作成し、その指示に従ったところ、サブツリーのマージをコミットすると、古いリポジトリからのすべてのファイルが新しく追加されたファイルとして記録されることを除いて、ほぼうまくいきました。 を実行すると、古いリポジトリからのコミット履歴を見ることができます。
git log
しかし
git log <file>
を実行すると、そのファイルに対するコミットが1つだけ表示されます(サブツリーのマージ)。 上記の回答に対するコメントから判断すると、この問題を見ているのは私一人ではありませんが、それに対する公開された解決策は見つかりませんでした。
リポジトリをマージして、個々のファイルの履歴をそのまま残す方法はありますか?
解決方法は?
外部依存を管理するのではなく、単に2つのリポジトリを接着し、最初からそうであったかのように見せかけようとするならば、答えはもっとシンプルであることがわかります。 古いリポジトリにリモートを追加し、新しいマスターにマージし、ファイルやフォルダーをサブディレクトリに移動し、移動をコミットし、追加したすべてのリポジトリで繰り返すだけでよいのです。 サブモジュール、サブツリーマージ、派手なリベースは、少し違った問題を解決するためのもので、私がやろうとしていたことには適していません。
以下は、2つのリポジトリを接着するPowershellスクリプトの例です。
# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init
# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
git commit --allow-empty -m "Initial dummy commit"
# Add a remote for and fetch the old repo
# (the '--fetch' (or '-f') option will make git immediately fetch commits to the local repo after adding the remote)
git remote add --fetch old_a <OldA repo URL>
# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories
# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}
# Commit the move
git commit -m "Move old_a files into subdir"
# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"
もちろん、old_b を old_a にマージすることも可能です (これが新しい統合レポになります)。
進行中の機能ブランチも引き継ぎたい場合は、こちらをご利用ください。
# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress
これはサブツリーのマージではなく、通常の再帰的なマージの引数として、ターゲットの名前を変更したことをGitに伝え、Gitがすべてを正しく並べるのを助けるためのものです。
もう少し詳しい説明を書きました こちら .
関連
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] ローカルファイルシステムからファイルを削除せずに、Git リポジトリからファイルを削除する
-
[解決済み] 2つのリビジョン間でどのファイルが変更されたかを表示する
-
[解決済み] Git のコミットからファイルを削除する
-
[解決済み] 2 つの Git リポジトリをマージする方法は?
-
[解決済み] サブディレクトリを別のGitリポジトリに切り離す(移動する)。
-
[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?
-
[解決済み】Gitバージョン管理でファイルの変更履歴を見る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】以下の追跡されていないワーキングツリーファイルは、マージによって上書きされますが、私は気にしません。
-
[解決済み] [email protected] へのいくつかの参考文献のプッシュに失敗しました。
-
[解決済み】gitの「not something we can merge」エラーの解決方法
-
[解決済み] GitHubに空のブランチを作成する
-
[解決済み] GitBash | origin master - rejected (fetch first) | GitHub リポジトリにファイルがない。
-
[解決済み] リモートブランチにプッシュできない、ブランチに解決できない
-
[解決済み] 2 つの Git リポジトリをマージする方法は?
-
[解決済み] git-mvは何のためにあるのですか?
-
[解決済み】既存のGitリポジトリを別のリポジトリにインポートする方法は?
-
[解決済み] ローカルブランチ、ローカルトラッキングブランチ、リモートブランチ、リモートトラッキングブランチの違いは何ですか?