一些提交中缺少 git-svn-id

标签 git heroku git-svn

我有一个旧的 SVN 存储库,我使用 git-svn 检查了它,以便处理它并推送到 Heroku。我正在做一个非常标准的 git push heroku mastergit svn rebasegit svn dcommit 舞蹈,一切都很好。

但是,最近我一直在做一些 git 工作,并且有一段时间没有做 git svn rebase 了。现在,当我尝试进行 rebase 时,由于 merge 冲突,它失败了,尽管我是唯一一个致力于 repo 并且只在 master 上工作的人。

确定可能是工作副本的问题我做了一个新的 git svn clone 然后是 git remote add herokugit pull heroku master 。 pull 执行快进 merge 没有问题,但 git svn rebase 仍然失败。

我做了一个简单的 git log,我发现我有一些旧的提交丢失了 git-svn-ids:

commit def8bab861314c67d4e8227e03775d19045d21d1
Author: peterr
Date:   Fri Sep 21 16:17:33 2012 +0000

    PHP Cedar support.

    git-svn-id: http://vcp.unfuddle.com/svn/vcp_bbsit@24 b6b24ac3-8b7a-4c11-a811-49c5d0334e85

commit f51bd78fb07dde6ec1dc4e0ba51a48f2b6bd1bd6
Author: pr1001
Date:   Mon Aug 20 19:39:42 2012 +0200

    Specify port correctly

commit 153bb2929080898dcab46142120def0f4964dfab

...

commit 5a416fa3af9f64aa353d5171bedfaa563115ff62
Author: pr1001
Date:   Mon Aug 20 17:22:58 2012 +0200

    PHP Cedar support.

commit e0b35588d03082a3a4ab49a7b590f206346046c0
Author: j
Date:   Fri Aug 3 08:13:33 2012 +0000

    change email

    git-svn-id: http://vcp.unfuddle.com/svn/vcp_bbsit@23 b6b24ac3-8b7a-4c11-a811-49c5d0334e85

来自 an SO answer我想我也许可以重写提交消息以添加缺失的信息,但我想知道这是否会更糟。

查看消息,我似乎有一些重复的提交,例如“PHP Cedar 支持”。我真的很困惑为什么我有这些重复项,尽管我怀疑它们可能被转发到失败的 git push heroku master 前几天我被告知存储库不同步。 git pull heroku master 似乎完全没有带来任何变化并解决了问题,但也许它带来了重复的提交。

所以,考虑到这一切,我的问题很简单,我该如何继续?我在 Heroku 上有一个可用的应用程序,在 SVN 存储库中有一个较旧的工作代码库,但我没有看到任何简单的方法来干净地将新提交放入 SVN。我应该挑选它们吗?然后我是否需要核对 Heroku 应用程序以避免重复项返回?

最佳答案

很难猜到你是如何陷入这种情况的,但我认为这是因为当推送到 SVN 时,git-svn 会用 git-svn-id 签名替换(使用 rebase 或 reset)提交,所以有 2 个示例每个提交:“本地”——没有“git-svn-id”签名——和带有签名的远程。

恢复:

  1. 创建一个临时分支以保持当前状态(某种 备份): git co -b backup
  2. 确保 refs/remotes/git-svn 指向最新的提交,其中 git-svn-id 对应于您的 subversion 存储库,并且 git log refs/remotes 显示没有没有 git-svn-id 的提交/git-svn

如果不是这样,您可以使用以下技巧来修复 refs/remotes/git-svn: 更新 refs/remotes/git-svn 以指向一切正常的最新提交(在您的情况下它对应于 r23):

$ git update-ref refs/remotes/git-svn e0b35588d03082a3a4ab49a7b590f206346046c0

设置 .git/svn/metadata 修订以指向该修订:

[svn-remote "svn"]
        reposRoot = ...
        uuid = <UUID>
        branches-maxRev = 23
        tags-maxRev = 23

删除(或最好移走)文件 .git/svn/refs/remotes/git-svn/.rev_map.UUID 现在运行

$ git svn fetch

您的 refs/remotes/git-svn 引用现在已恢复为最新的有效 SVN 修订版。

3。从 Git 存储库中获取所有更改而不 merge

$ git fetch heroku master

现在您的所有更改都在 refs/remotes/heroku/master 中。

4。确保您没有本地更改(我建议您现在在 master 上)。将 refs/heads/master 重置为 refs/remotes/git-svn。其中一种方法:

$ git update-ref refs/heads/master refs/remotes/git-svn
$ git reset --hard HEAD

5。查看 refs/remotes/heroku/master 和 refs/remotes/git-svn。 Git 存储库中是否存在 refs/remotes/git-svn 中不存在的更改?如果是,请一一挑选。还要查看您的备份分支(仅在没有 git-svn-id 的提交时),如果它们还不在 SVN 中,也请挑选它们。

6。现在您在 master 中有了一些 SVN 中还没有的更改。运行

$ git svn dcommit

将它们推送到 SVN。

7。现在您的 SVN 相关分支已完全修复并具有所有更改。如果我理解正确的话,你想要 Git 存储库中的相同内容。最好将 refs/remotes/heroku/master 替换为当前的 master 内容:

$ git push heroku master --force

现在您的 Git 存储库与 SVN 存储库具有相同的内容。

为了避免将来出现这些问题,请确保您从不将没有 git-svn-id 的提交推送到 Git(即,当您运行“git push”时,您的 master 包含带有 git-svn 的提交-id 签名——如果没有——先运行“git svn dcommit”将它们推送到 SVN)。

关于一些提交中缺少 git-svn-id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571730/

相关文章:

带有 git 扩展的 git-svn 停留在身份验证领域

svn - git 存储库中的提交数

python - 在 heroku 中没有运行 Django 的 Web 进程

node.js - 如何区分 Heroku 配置变量与 .Env 变量之间的区别

git - 无法 Git 推送从共享 Windows 存储库(本地网络)挂载文件夹

git - 是否有办法在 Team Foundation 服务器中创建 git 项目?

git - 您是忽略 .gitignore 中的 git 子模块还是将其提交到您的存储库?

node.js - 从 Heroku 连接到 MongoLab 时应用程序超时

git - 如何设置 gitattributes 来过滤文件的一部分?

git - 如何将提交从主干移动到 Git 中的分支?