合并两个 Git 仓库

是这么个情况,我使用 Android Studio 项目里开启 Git 版本控制,但是他默认给我开成 app 这个 Module 的了,应该是开 Project 的来着。简单来说,就是 Git 的根目录应该在 /Project 下,而现在却成了 /app 下

如果你还不明白,那么再简单点 ↓↓

1
2
3
4
5
6
7
8
.
└── Project
├── app
│ ├── xxx6.txt
│ ├── xxx7.txt
│ └── xxx8.txt
├── xxx1.txt
└── xxx2.txt

就是这个样子,Git 的根目录成了 /app ,而需要的是 /Project ,但是 app 又是 Project 的子目录,想迁移过去又不想丢失 Commit 数据…

为了描述方便,也为了看的明白,我简单点说
有 2 个 Git 仓库:repo1 和 repo2
repo1 是 repo2 的子目录
想要把 repo1 中的文件移入 repo2
repo1 的 Commit 记录要保留

当前文件结构如下

1
2
3
4
5
.
└── repo2
├── repo1 ==============> Git 仓库
│ └── repo1.txt
└── repo2.txt

想要的结果是

1
2
3
4
5
.
└── repo2 ==============> Git 仓库
├── repo1
│ └── repo1.txt
└── repo2.txt

开始

  1. 新建 repo1 子目录,将原 /repo1 的文件移动至 /repo1/repo1

    cd repo1
    mkdir repo1
    find -maxdepth 1 -not -name . -not -name repo1 -not -name .git -exec mv {} ./repo1 \;

    目录结构变成

    1
    2
    3
    4
    5
    .
    ├── repo1
    │ └── repo1
    │ └── repo1.txt
    └── repo2.txt
  2. 在 repo1 Git 提交刚才的操作

  3. 在 repo2 中 将 repo1 作为远程仓库,添加进来,设置别名为 temp

    cd ../repo2
    git remote add temp ../repo1/

  4. 从 repo1 中抓取数据到当前 repo2 仓库

    git fetch temp

  5. 将 repo1 中抓来的 master 分支作为新分支 checkout 到本地,新分支名命名为 repo1

    git checkout -b repo1 temp/master

  1. 切换回 repo2 的 master 分支,并将 repo1 分支合并到 master

    git checkout master
    git merge repo1

  2. 删除 repo1 分支和远程地址 temp

    git branch -d repo1
    git remote remove temp

这样就可以了。大致思路就是伪造远程 repo1 仓库为 repo2 的一个分支,然后合并进来