我有一个旧的SVN存储库,我使用git-svn
检查了它以便处理它并推送到Heroku。我正在做一个非常标准的git push heroku master
,git svn rebase
,git svn dcommit
舞蹈,一切都很好。
然而,最近我做了很多git工作,并且暂时没有做git svn rebase
。现在,当我尝试做一个rebase时,它因为合并冲突而失败,尽管我是唯一一个致力于回购并且只在主人工作的人。
确定可能是工作副本的问题我做了一个新的git svn clone
,然后是git remote add heroku
和git pull heroku master
。拉动进行快进合并没有问题,但git svn rebase
仍然失败。
我做了一个简单的git log
,我发现我有一些旧的提交缺少git-svn-id
s:
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应用程序才能让重复版本回来?
答案 0 :(得分:4)
猜测你是如何陷入这种情况并不容易,但我认为这是因为当推送到SVN时git-svn用git-svn-id签名替换(使用rebase或reset)提交所以有两个例子每个提交:“本地” - 没有“git-svn-id”签名---并且远程签名。
要恢复:
git co -b backup
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。确保你没有本地更改(我建议你现在在掌握)。将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 signatgures only - 如果不是 - 运行“git svn dcommit”将它们推送到SVN。