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

标签 git svn git-svn svn-propset

我使用 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 的完整输出,因为它有很多,但这是真正有趣的地方,所以我将发布我所做的一切的列表:

  1. 我检查了一个分支,而不是出现错误的分支。正在运行 git svn reset没有区别:remotes/origin/branchname继续指向最近的提交。不出所料,git svn fetch什么也没做。

  2. 我 checkout 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
    

    请注意,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/

相关文章:

svn - 如何使svn自动检测文件的删除和移动(shell,Ubuntu)

xcode - SVN 和 Xcode 问题

Svn -> 带有多个主干/分支/标签的 git 迁移

svn - 如何将 git 存储库同步到 subversion?

git - SubGit:如何排除分支?

Git 推送到错误的分支

git - 如何将带有发行说明的标签推送到另一个 github 服务器?

maven - 我可以直接将 Maven 发布插件与 git-svn 一起使用吗?

git - 如何获取LFS文件的实际大小?

git - Azure DevOps,git fetch 失败,退出代码 128,致命 :Authentication failed for