在历史Subversion修订版更改后修复git-svn存储库

me_*_*and 7 svn git git-svn svn-propset

我使用git-svn来保存共享Subversion存储库的克隆.最近有人编辑的修订提交的信息(一拉 这太问题)后,我曾git svn fetch编那个版本.如何更正我的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
$ 
Run Code Online (Sandbox Code Playgroud)

没有输出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/*
Run Code Online (Sandbox Code Playgroud)

我不会发布完整的输出git branch -avv,因为它有很多,但这就是它真正有趣的地方,所以我会发布我做的所有事情的列表:

  1. 我有一个除了分支以外的分支检查错误.跑步git svn reset没有任何区别:remotes/origin/branchname继续指向更近期的提交.不出所料,git svn fetch什么也没做.

  2. 我检查了一下remotes/origin/branchname又跑git svn reset了.这工作:remotes/origin/branchname指向duff提交的父级.

  3. 我跑git svn fetch.这绝对没有任何结果:没有提交任何提交remotes/origin/branchname但没有移动.

  4. 我在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
    
    Run Code Online (Sandbox Code Playgroud)

    请注意HEAD,除此之外,现在没有任何内容指向此分支上的某些提交.

我很快得出结论,至少有一些这种行为只是一个错误git svn.当然,我在上面第4点看到的并不是应该发生的事情,至少我的理解是这样.

sle*_*ske 2

git svn reset确实是正确的做法。假设 SVN 版本 4711 已更改,步骤如下:

1) 放弃更改的 SVN 修订版(及其之后的所有内容):

$ git svn reset -p 4711
r1 = 18614es3df44c30da07 (refs/remotes/git-svn)
Run Code Online (Sandbox Code Playgroud)

2) 获取更改后的版本:

$ git svn fetch
rereading 18614es3df44c30da07 
        A       trunk/a
r4711 = 8dfb7d0758dbbc1d06004 (refs/remotes/git-svn)
        A       trunk/b
r4712 = e7337af3743e48c90ef3fa09906378b95997314c (refs/remotes/git-svn)
[...]
Run Code Online (Sandbox Code Playgroud)

3)现在git-svn的数据已修复。您仍然必须修复当地的分支机构。例如,如果 master 跟踪 SVN 主干,请运行:

git rebase remotes/git-svn
Run Code Online (Sandbox Code Playgroud)

(其中“remotes/git-svn”是由创建的远程跟踪分支git svn- 它可能有不同的名称)。

这在git svn 手册页的“reset”子命令部分中有很好的解释。