Gitで2つのリポジトリを統合したい

投稿者: Anonymous

どうにも困っておりまして、質問させていただきます。

現在、違うサーバにAというリポジトリと、Bというリポジトリがあり、これをAのサーバに統合したいのですが、
A–.git
 |–develop–B–.git
       |-home
としたときに、BがAのリポジトリに認識されず、commit,pushした後、別の端末でAをクローンすると、
A–.git
 |–develop–B
となり、Bの中身を取得することができませんでした。
別のリポジトリだからだと思い、git remote set-urlでリモートリポジトリを変更したのですが、効果がありませんでした。

履歴を残す必要があり、以下の記事を読んだりしたのですが、どのようにすればよいのかわかりません。
https://chaika.hatenablog.com/entry/2015/06/04/173401

どうかご教授お願いいたします。

解決

git リポジトリの中に git repository を物理的に配置した場合、それは git submodule が実体化されたものであると認識して動作するようになっています。 submodule は、端的に言えば、ディレクトリ構造をコミットするかわりに別リポジトリのコミットの sha-id のみを記録しておく機能です。

submodule ではなく、 git の履歴自体を取り込みながら、とある統合コミットがあって、それは二つのリポジトリの歴史のマージコミットであり、一方がもう一方のサブディレクトリに配置されているようなことが実現したい場合、これは git subtree を用いるのが良いです。

git subtree add --prefix=サブディレクトリへのパス リモート ブランチ

で実行します。

具体例

準備スクリプト

#!/bin/bash

rm -rf A
mkdir A

( cd A
  git init
  echo hoge > hoge
  git add -A
  git commit -m "init hoge"
)

rm -rf B
mkdir B

( cd B
  git init
  echo fuga > fuga
  git add -A
  git commit -m "init fuga"
)

A リポジトリ

.
└── hoge

B リポジトリ

.
└── fuga

実行スクリプト

cd A
git remote add B ../B
git fetch --all
git subtree add --prefix=B B master

結果

$ cd A
$ tree
.
├── B
│   └── fuga
└── hoge
$ git log --oneline --graph
*   d05554a Add 'B/' from commit 'c4945e3a01ecfd7e9ed88c76222c52a1e10c3235'
|  
| * c4945e3 init fuga
* a842d05 init hoge
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *