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

3
我有一个老的SVN仓库,我使用 git-svn 检出它以便在上面工作并推送到Heroku。我一直在做着非常标准的 git push heroku master , git svn rebase , git svn dcommit ,一切都很好。然而,最近我一直在进行大量的git工作,并且还没有进行过 git svn rebase 。现在,当我尝试进行rebase时,由于合并冲突而失败,尽管我是唯一提交到repo并只在master上工作的人。考虑到问题可能是工作副本,我进行了新的 git svn clone ,然后进行了 git remote add heroku 和 git pull heroku master 。pull与没有问题的快进合并,但是 git svn rebase 仍然失败。我进行了简单的 git log ,发现我缺少一些旧的提交中的 git-svn-id 。
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

根据一个SO答案,我认为我可以重写提交消息来添加丢失的信息,但我想知道这是否会更糟。

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

那么,鉴于所有这些情况,我的问题很简单,我该如何继续?我在Heroku上有一个可工作的应用程序和一个较旧的工作代码库在SVN repo中,但我找不到任何清洁地将新的提交放入SVN的简单方法。我应该使用cherry-pick吗?然后我需要摧毁Heroku应用程序以避免重复的提交回来吗?

1个回答

4
很难猜到你是如何陷入这个情况的,但我认为这可能是因为在推送到 SVN 时,git-svn 使用 rebase 或 reset 用 git-svn-id 签名替换提交,因此每个提交都有两个实例:"本地"——没有 "git-svn-id" 签名——和远程带有签名的实例。
恢复方式如下:
1. 创建一个临时分支以保存当前状态(一种备份):git co -b backup 2. 确保 refs/remotes/git-svn 指向具有与您的 subversion 存储库相对应的 git-svn-id 的最新提交,并且没有不包含 git-svn-id 的提交被 git log refs/remotes/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 存储库获取所有更改,而不进行合并。

$ 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:

$ git push heroku master --force

现在你的Git代码库与SVN代码库具有相同的内容。

为了避免这些问题,请确保您永远不要在没有git-svn-id的情况下推送提交到Git(即,当您运行“git push”时,您的主分支仅包含带有git-svn-id签名的提交--如果不是,请先运行“git svn dcommit”将它们推送到SVN)。


1
我遇到了完全不同的问题,但这篇文章为我提供了有关git-svn的信息,帮助我解决了问题。谢谢! :) - Doug Paul

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