【问题标题】:Split a Git Repository Into Two将 Git 存储库一分为二
【发布时间】:2015-03-07 03:19:33
【问题描述】:

我有一个包含多个分支的 git 存储库,我想将其拆分为两个存储库。

假设我列出了对该存储库的所有提交,结果类似于:

Commit #1 to branch master
Commit #2 to branch master
Commit #3 to branch fixing_bugs
Commit #4 to branch master
Commit #5 to branch fixing_bugs
Commit #6 to branch master
Commit #7 to branch adding_sexy_french_girls_to_the_code
Commit #8 to branch adding_sexy_french_girls_to_the_code
Commit #9 to branch master

因此,这个存储库总共有 3 个分支:masterfixing_bugsadding_sexy_french_girls_to_the_code

现在我想使用提交 #6 将这个存储库一分为二。所以我会有 两个存储库,如下所示:

存储库 1

Commit #1 to branch master
Commit #2 to branch master
Commit #3 to branch fixing_bugs
Commit #4 to branch master
Commit #5 to branch fixing_bugs

拥有分支masterfixing_bugs

存储库 2

Commit #6 to branch master
Commit #7 to branch adding_sexy_french_girls_to_the_code
Commit #8 to branch adding_sexy_french_girls_to_the_code
Commit #9 to branch master

拥有分支masteradding_sexy_french_girls_to_the_code

我知道这在技术上可能具有挑战性,但我相信使用 Git 并非不可能(希望)。

我该怎么做?

谢谢。

【问题讨论】:

  • 存储库 2 的树是否仍应包含在 Commit #1-#5 中完成的所有更改?
  • 是的。但都合并到提交 6 中。

标签: git shell github repository git-branch


【解决方案1】:

从你的主人创建你的第二个分支

git checkout -b <your_new_branch>

我建议您从每个分支中的相同代码开始,并通过 rebase 重写历史记录:

git rebase HEAD~9 -i

然后您可以轻松删除每个分支所需的行。

因为你正在重写你的历史,你将不得不强制改变:

git push origin <your_branch> --force

[更新] 我看到了最后一个 cmets,那么您将不得不在存储库 2 上压缩您的提交,以便将每个 pick 替换为 s 以使用您最后一次提交 #6 进行压缩。

在存储库 1 上 git rebase HEAD~9 -i 之后:

pick #1 to branch master
pick #2 to branch master
pick #3 to branch fixing_bugs
pick #4 to branch master
pick #5 to branch fixing_bugs
pick #6 to branch master
pick #7 to branch adding_sexy_french_girls_to_the_code
pick #8 to branch adding_sexy_french_girls_to_the_code
pick #9 to branch master 

你应该有:

pick #1 to branch master
pick #2 to branch master
pick #3 to branch fixing_bugs
pick #4 to branch master
pick #5 to branch fixing_bugs

(在 vim 上输入 dd 删除行)

在存储库 2 上 git rebase HEAD~9 -i 之后:

pick #1 to branch master
pick #2 to branch master
pick #3 to branch fixing_bugs
pick #4 to branch master
pick #5 to branch fixing_bugs
pick #6 to branch master
pick #7 to branch adding_sexy_french_girls_to_the_code
pick #8 to branch adding_sexy_french_girls_to_the_code
pick #9 to branch master 

你应该有:

s #1 to branch master
s #2 to branch master
s #3 to branch fixing_bugs
s #4 to branch master
s #5 to branch fixing_bugs
pick #6 to branch master
pick #7 to branch adding_sexy_french_girls_to_the_code
pick #8 to branch adding_sexy_french_girls_to_the_code
pick #9 to branch master 

(编辑行,前5行将被#6压扁)

【讨论】:

    【解决方案2】:

    您可以使用git format-patchgit am 将提交从现有存储库复制到新存储库,然后使用git reset 从现有存储库中删除复制的提交。

    尝试使用以下命令将提交复制到新存储库:

    $ cd /path/to/new_repo_folder # don't forget to run git init if this is a new folder
    $ git --git-dir=/path/to/existing_repo_folder/.git format-patch --stdout sha1_of_commit5..sha1_of_commit_9 | git am
    

    所以本质上,git format-patch 命令为您的每个提交创建一个补丁文件,从提交 6 到提交 9。如果未提供 --stdout 选项,这些补丁文件将保存在您的 existing_repo_folder 中。随后,git am 命令将提交 6 的历史记录应用到您的new_repo_folder 中的提交 9。现在,当您在 new_repo_folder 中运行 git log 时,您将看到提交 6 到 9 的历史记录。

    最后,如果commit 9 是你的HEAD,那么你可以在existing_repo_folder 中运行git reset --hard HEAD~3HEAD 的位置设置为commit 5,也就是之前的3 次commit,这就是@987654341 @ 代表。

    当然,您本质上是您的存储库的rewriting the history。如果您与其他人共享您的代码,请确保您已达成共识。否则,你的下一个git push -f 将会给大家带来很大的悲痛。

    【讨论】:

    • 在新的存储库目录中运行以下命令 git --git-dir=/home/nemewsys/Desktop/original/lumina.git format-patch --stdout ed2bf8e..aa9a48f |我得到了 git:pastebin.com/VsVydaz0 我做错了什么?
    • @ManelJ 它在抱怨error: proj/pom.xml: does not exist in indexproj/pom.xml 是否存在于您的新文件夹中?此外,您的--git-dir 选项应该是Desktop/original/lumina/.git(参考.git 文件夹)。请记住,Desktop/original/lumina/ 中的文件结构必须与旧文件夹相同。
    • 我很困惑。我的新文件夹是空的,我只是在那里做了 git init,仅此而已。我正在新文件夹中运行该命令。
    • 注意:Desktop/original/lumina/是old仓库的文件夹。
    • @ManelJ 对。那么如果你将Desktop/original/lumina/Desktop/original/lumina/.git除外)的内容复制到你的新文件夹,然后跟着git init呢?请记住,git formatgit am 命令只是使用旧文件夹中的提交历史来修补您的新存储库。如果proj/pom.xml 不存在于您的新仓库中,除非它是您补丁中历史记录的一部分,否则它不会神奇地为您创建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2023-03-19
    相关资源
    最近更新 更多