GIT:在一个存储库中分离两个项目

时间:2017-05-10 15:19:30

标签: git version-control

假设我在一个git存储库中有两个不相关的项目。每个项目都驻留在自己的文件夹中,但两个文件夹都在主分支中。 git repo结构如下所示:

Folder structure:
/path/to/projectfolders/
|-  .git
|-  project1
|-  project2

Branch master:
p1_commit1 <- p2_commit1 <- mixed_commit <- p1_commit2 <- p2_commit3 <- master

mixed_commit表示project1和project2中有添加/修改。 我想将这两个项目放在两个独立的分支--p1和p2 - 不共享任何历史记录,以便repo看起来像这样:

Branch p1:
p1_commit1 <- p1_mixed_commit <- p1_commit2 <- p1

Branch p2:
p2_commit1 <- p2_mixed_commit <- p2_commit3 <- p2

我想到的策略是首先创建两个分支p1和p2。 然后签出p1并删除与project2相关的每个提交。 然后签出p2并删除与project1相关的每个提交。

最后,删除主分支。

由于我还是git的新手,我对此有两个疑问:

  1. 这是一个安全的策略,还是有任何弊端 没想到?

  2. 如果策略良好,删除该策略的最佳方法是什么 每个分支的常见提交历史记录?我在考虑使用 改变,然后&#34;简单&#34;只选择属于的提交 专用分支上的项目。这足以摆脱它 另一个项目的无关承诺?

  3. PS: 由于人们一直在建议,将存储库拆分为两个单独的存储库是一个选项。它必须是一个存储库。

1 个答案:

答案 0 :(得分:0)

我终于找到了将master中的项目分成专用分支的解决方案。我将完成将项目2分成自己的分支所需的步骤。

我将假设此示例的以下存储库和文件夹结构:

Folder structure:
/path/to/projectfolders/
|-  .git
|-  project1
|-  project2

Branch master:
p1_commit1 <- p2_commit1 <- mixed_commit <- p1_commit2 <- p2_commit3 <- master

mixed_commit表示project1和project2中都有添加/修改。

第1步

Checkout master并生成一个指向master的HEAD的临时分支:

git checkout master
git checkout -b tmp

第2步

搜索日志以确定哪个提交对哪个项目有贡献。确定属于您要分离的项目的最早提交,例如,对于项目2,这将是p2_commit1。 还要注意像mixed_commit之类的提交,它们为这两个项目提供了文件。

git log --stat # write down commit hashes that belong to project 2

第3步

检查最早提交项目2的孤立分支(为项目2命名,例如p2)并清除它,即删除任何不属于项目2的文件。当git检查时在孤立分支中,它将具有已经暂存的受此提交影响的文件。通过删除索引可以轻松纠正此问题。然后,您只能暂存属于项目2的文件并提交它们

git checkout --orphan p2 <hash of p2_commit1>
rm .git/index # clear index
rm -r project1 # remove any files/folders not related to project 2
git add project2
git commit -m "Created branch for project 2"

新创建的分支现在包含项目2的最早提交。

第4步

切换回临时分支。然后以交互方式将tmp分支变为p2

git checkout tmp
git rebase -i p2

这是编辑器启动时交互式rebase的外观。请注意,p2_commit1未提供,因为它已在分支p2中。

pick hash1 p1_commit1
pick hash2 mixed_commit
pick hash3 p1_commit2
pick hash4 p2_commit3

仅选择属于项目2的那些提交(您在第2步中记下的提交)。您必须手动edit包含两个项目文件的提交。所以你的最终rebase文件可能如下所示:

edit hash2 mixed_commit
pick hash4 p2_commit3

保存更改并关闭编辑器。只要遇到标记为edit的提交,rebase就会被中断。执行需要执行的操作以删除不属于项目2的文件并修改comit。此示例方案中的过程可能类似于

# git rm -r project1
# git commit --amend

如果您对结果感到满意,请继续进行基础设置过程并检查日志以验证所有提交是否已正确重新定位。

git rebase --continue
git log --stat

第5步

目前,我们仍然在临时分支机构。结帐分支p2并检查日志。

git checkout p2
git log --stat

它仅包含第3步的初始提交。其余相关提交位于临时分支上,因此我们必须合并:

git merge tmp

如果在第4步中一切顺利,那么最后一个命令将导致快进合并。

我们最终为项目2提供了一个专用分支,它只包含为project2提供文件的提交。现在不再需要临时分支。

第6步

这是最后的清理步骤。只需删除现已过时的临时分支。

git branch -D tmp

完成。

现在您可以结帐master

git checkout master

并重复第1步第6步,以便分离存储库中的其余项目。