我使用 git-svn 来保存共享 Subversion 存储库的克隆。最近有人在我有 git svn fetch
之后编辑了修订版的提交消息 (a la this SO question)编辑那个修订版。如何更正我的 Git 克隆以获得正确的提交消息?
我曾期待 git svn reset
其次是 git svn fetch
重新获取此提交并更新内容,让我只需要修复我的本地分支机构,但这实际上似乎没有做任何事情; git svn fetch
不会重新获取我重置为的提交。
(是的,我认为更改提交消息是个坏主意,但这不是我可以控制的。)
更新:我尝试了 sleske 建议的过程(事实上,我在提出问题之前已经尝试过,但我只是再次尝试以防万一),但没有成功。我得到如下输出:
me_and@centos ~/code ((358a2dd...)) Fri 16 Jan 15:31:27
$ git svn reset -p 55102
r55094 = 25d126219f7eeddfc7d0842704c7efcc0443dd70 (refs/remotes/origin/branchname)
me_and@centos ~/code ((358a2dd...)) Fri 16 Jan 15:33:06
$ git svn fetch
me_and@centos ~/code ((358a2dd...)) Fri 16 Jan 15:33:08
$
git svn fetch
没有输出(或者自从我上次运行它以来是否有提交,但它只是获取新的提交,而不是重新获取旧的),特别是没有 rereading
sleske 示例中的消息。
如果相关,我使用的是 Git v2.0.4。
更新 2:略微编辑 .git/config
下面:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = http://server/repos/repo
fetch = trunk:refs/remotes/origin/trunk
branches = branches/*:refs/remotes/origin/*
tags = tags/v10/*:refs/remotes/origin/tags/*
tags = tags/v11/*:refs/remotes/origin/tags/*
tags = tags/v12/*:refs/remotes/origin/tags/*
tags = tags/v13/*:refs/remotes/origin/tags/*
我不会发布 git branch -avv
的完整输出,因为它有很多,但这是真正有趣的地方,所以我将发布我所做的一切的列表:
我检查了一个分支,而不是出现错误的分支。正在运行
git svn reset
没有区别:remotes/origin/branchname
继续指向最近的提交。不出所料,git svn fetch
什么也没做。我 checkout
remotes/origin/branchname
然后跑了git svn reset
再次。这有效:remotes/origin/branchname
指向 duff 提交的父级。我跑了
git svn fetch
.这绝对没有做任何事情:没有获取任何提交并且remotes/origin/branchname
没动。我在 Subversion 存储库的那个分支上创建了几个虚拟提交(一个添加了一个空文件,下一个又删除了它),然后运行
git svn fetch again
.这就是真正奇怪的地方:没有重新获取 duff 提交。相反,提取从我添加虚拟文件的提交开始,报告过程中出现“索引不匹配”。运行
git show
在添加虚拟文件的提交上显示它以及我重置为的提交和虚拟提交之间的所有差异。现在,运行
git log --graph --decorate --pretty=oneline --abbrev-commit HEAD origin/branchname
看起来像这样:* 7b12bbc (origin/branchname) Remove dummy file * 730c2ab Add dummy file # But `git show 730c2ab` includes the diffs between b89af06 and 93920f9 as well | * 93920f9 (HEAD) Uninteresting commit | * 91c7163 Uninteresting commit | * ce51022 Commit with the changed commit message |/ * b89af06 Uninteresting commit
请注意,
HEAD
除外,现在没有任何内容指向此分支上的某些提交。
我很快得出结论,至少其中一些行为只是 git svn
中的一个错误.当然,我在上面第 4 点中看到的情况根本不应该发生,至少在我看来是这样。
最佳答案
git svn reset
确实是正确的做法。假设更改了 SVN 修订版 4711,则步骤为:
1) 丢弃更改后的 SVN 修订版(及其之后的所有内容):
$ git svn reset -p 4711
r1 = 18614es3df44c30da07 (refs/remotes/git-svn)
2) 获取修改后的版本:
$ git svn fetch
rereading 18614es3df44c30da07
A trunk/a
r4711 = 8dfb7d0758dbbc1d06004 (refs/remotes/git-svn)
A trunk/b
r4712 = e7337af3743e48c90ef3fa09906378b95997314c (refs/remotes/git-svn)
[...]
3) 现在git-svn的数据已经修复了。您仍然必须修复本地分支机构。例如master跟踪SVN主干,运行:
git rebase remotes/git-svn
(其中“remotes/git-svn”是由 git svn
创建的远程跟踪分支 - 它可能有不同的名称)。
这在 git svn manpage 中有很好的解释。 ,在“重置”子命令的部分。
关于git - 历史 Subversion 修订更改后修复 git-svn 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27963864/