将两个具有两个分支的Git仓库合并为一个

3

在整个一天的Google搜索之后,我不得不向专家们求助。

我克隆了一些公共的SVN仓库,并将其转换为git。这个仓库只有一个主分支,它从某个特定版本(比如1.0)开始。

我还有一个独立创建的git仓库,也是从1.0版本开始的。我创建这个仓库是因为我想要修改一些公共项目。我只是下载了源代码,创建了一个空的git仓库,添加了1.0版本,然后开始进行修改。这个仓库也只有一个主分支。

现在,我想创建第三个git仓库,以1.0版本为起点,它将有两个分支:'svn'和'mystuff'。我希望保留两个分支的历史记录。

       1.0
      /   \
     /     \
br. svn    br. mystuff
     |       |
   v1.1      v1.1'
   v1.2      v1.2'
   v1.3      v1.3'
    .          .
    .          .

如果我有这个工具,就可以使用svn2git轻松地从SVN存储库获取新版本,并将它们与本地的“mystuff”分支轻松合并。我不需要推送到SVN存储库,只需从中获取新版本即可。
你能帮我重新让使用Git变得有趣吗?
1个回答

2
一种有点取巧的方法是使用 git format-patch 将仓库中的所有提交导出到一个目录中,然后使用 git checkout 切换到另一个仓库的 1.0 分支,创建一个新分支 (git checkout -b new-branch),最后使用 git am 命令应用之前生成的补丁。
因此,我们将你克隆的公共 SVN 仓库称为 public,将你下载源代码并进行修改后得到的 git 仓库称为 local
cd local
mkdir ../patches

# -o tells the output directory for the patches
# the git log ... gives you the hash of the second commit of the repo (the first one
# changes are already present in your 'public' repo
git format-patch -o ../patches/ $(git log --pretty=format:%H | head -n-1 | tail -1)

cd ../public
git checkout -b mystuff 1.0
# Apply patches
git am ../patches/*

谢谢。听起来这是我的问题的完美解决方案,但我一直收到这个错误:已经存在于索引中 Patch failed at 0001 initial commit我在项目的每个文件中都遇到了这个问题。是否可以提供 git format-patchgit am 的工作示例? - user1832156
1
@user1832156 我认为你可能需要忽略第一个提交,因为那个提交是你的 1.0 分支已经拥有的相同树。我更新了答案,请尝试这样做。 - mgarciaisaia
非常感谢您的帮助。我希望这对其他人有用。我一直遇到很多“补丁不适用”错误,最终放弃了。我甚至手动从我的本地仓库提交了第一个提交,并调整了您的示例以从第二个提交开始,但我仍然遇到了“补丁不适用”的问题。由于这花费了太多时间,我放弃了。但总的来说,您的答案是正确的。 - user1832156

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接