很难猜测你是如何陷入这种情况的,但我认为这是因为当推送到 SVN 时,git-svn 用 git-svn-id 签名替换(使用 rebase 或重置)提交,因此每个提交有 2 个示例: “本地”——没有“git-svn-id”签名——而远程则带有签名。
恢复:
- 创建一个临时分支来保持当前状态(某种
备份):
git co -b backup
- 确保 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 revisions 以指向该修订版:
[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 存储库中有相同的内容。最好用当前的 master 内容替换 refs/remotes/heroku/master :
$ git push heroku master --force
现在您的 Git 存储库具有与 SVN 存储库相同的内容。
为了避免将来出现这些问题,请确保您never将没有 git-svn-id 的提交推送到 Git(即,当您运行“git Push”时,您的 master 仅包含带有 git-svn-id 签名的提交 - 如果没有 - 运行“git svn dcommit”将它们推送到 SVN第一的)。