git - 如何告诉 Git 在不相交的历史记录中两个提交实际上是相同的?

标签 git version-control git-svn

我有一个 Git 存储库,它是从另一个 Git 存储库克隆而来的,而另一个 Git 存储库是从一个巨大的 SVN 存储库克隆而来的。我们可以从 SVN 更新另一个 Git 存储库,然后从它提交到 SVN,但使用另一个用户。

我想通过我自己的用户直接将我的本地提交发布到 SVN 存储库。

这是我尝试过的:我手动创建了 git-svn 分支,将其添加到 .git/config

[branch "master"]
[svn-remote "svn"]
        url = https://url/to/svn/trunk/repo_name
        fetch = :refs/remotes/git-svn

然后 git svn fetch,下载了 32k 提交。

但我最终得到了两个不相交的历史:

  1. 一个来自 Git:
    1. 从提交 674c35a 开始,它表示原始克隆时 SVN 存储库的状态。
    2. 分支 master 始终与 SVN 同步(通过其他 Git 存储库)。
    3. 分支 dev 有我们当前的开发,应该 merge 到 master(通常被压缩),然后提交回 SVN 存储库。
  2. 一个用于 SVN 存储库:
    1. 从正确的初始提交开始。
    2. 它有 30k+ 次提交。
    3. Git 最初从 SVN [fb1b9c7] 克隆的提交(但仅与以前的提交有差异,而不是整个 repo 作为开始提交)。
    4. 然后相同的提交(100+)应该是 git/origin/master 所共有的。

我如何告诉 Git 开始提交 (674c35a) 实际上与 SVN 提交 (fb1b9c7) 相同?所以 Git 能以某种方式理解 master 中的提交,在克隆之后,实际上与 git-svn 相同吗?

我已尝试使用 --onto 进行 rebase ,如 here 所述,但这并不是我真正想要的(提交不在分支的顶部)。

最佳答案

我相信我在我的博客文章 Grafting History with Git 中有一个方法可以解决这个问题为了遵守网站规则,我将在此处进行总结:

当前状态:

  • 两个有着不同历史但起源相同的 git repos

目标状态:

  • 一个 git 存储库有两个分支代表那些不同的历史

  • 将两个历史记录都转换成 Git 分支(我想你已经知道了)
  • 通过比较日志和查看 哈希何时更改来找到分歧点
    • 使用 git log --reverse --format="%T %H" 获取每个分支上的树 ID 和提交 ID 列表,并将其保存到文件中
    • 比较列表以查看树哈希在哪里发散(我使用可以执行列的 diff 程序,不过您可以只使用 awk 和 diff)
  • 检查目标repo分支上的分歧点并创建新分支
  • 从源中获取所有对象到目标中
  • 对于原始源中的每个修订,在目标上创建一个新修订
    • 是使用 git read-tree -um $TREEID
    • check out 外部修订版的树
    • 使用原始提交消息使用 git commit --reuse-message $ORIGINAL_COMMIT

或者 ... 将您的 tree-id + commit-id 列表放入此脚本中。

#!/bin/bash
# graft script
while read TREE COMMIT
do
 git read-tree -um $TREE
 git commit --reuse-message $COMMIT
done

关于git - 如何告诉 Git 在不相交的历史记录中两个提交实际上是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39796464/

相关文章:

version-control - Subversion 的免费源代码管理替代方案

git - 从 SVN 转换到 Git 时,如何将修订号放在提交消息中?

windows - sysopen 权限被拒绝

git - 我在 GitHub 上的提交不是来自 "my"用户

c# - 如何从 C# 应用程序检索 git Commit Id?

database - 如何用git迁移数据库?

version-control - 如何在emacs的边缘添加差异标记?

git - Sublime 中的文件内容不会随 Git 分支更改而更改

version-control - 我如何回顾性地告诉 perforce 文件夹重命名?

Git-svn merge 和提交分支