代码之家  ›  专栏  ›  技术社区  ›  Phillip B Oldham

git svn:重置主控形状跟踪

  •  28
  • Phillip B Oldham  · 技术社区  · 16 年前

    我在用 git-svn 使用SVN存储库。我的工作副本是使用 git svn clone -s http://foo.bar/myproject 因此,我的工作副本遵循SVN(主干、标记、分支)的默认目录方案。

    最近我一直在研究一个分支,它是用 git-svn branch myremotebranch 并使用签出 git checkout --track -b mybranch myremotebranch . 我需要在多个地方工作,所以我要从分公司 git-svn dcommit -定期向SVN存储库发送ED文件。

    完成更改后,我切换回主服务器,执行合并,提交合并,并尝试将成功的合并数据提交到远程主干。

    似乎在合并之后,主机的远程跟踪已切换到我正在处理的分支:

    # git checkout master
    # git merge mybranch
    ... (successful)
    # git add .
    # git commit -m '...'
    # git svn dcommit
    Committing to http://foo.bar/myproject/branches/myremotebranch ...
    #
    

    有什么方法可以更新主控形状以便它跟踪吗 remotes/trunk 和合并前一样?

    我用的是Git1.7.0.5,如果有帮助的话。

    如果你能解释一下 为什么? 这发生了,所以我可以避免问题再次发生。谢谢!

    编辑:

    这是我的电流 .git/config :

    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        autocrlf = false
    [svn-remote "svn"]
        url = http://foo.bar/myproject
        fetch = trunk:refs/remotes/trunk
        branches = branches/*:refs/remotes/*
        tags = tags/*:refs/remotes/tags/*
    [branch "mybranch"]
        remote = .
        merge = refs/remotes/myremotebranch
    

    因此,似乎树干指向了正确的位置。但是,切换到分支然后返回到主节点并没有帮助; git svn dcommit 在主人仍试图推动 myremotebranch .

    6 回复  |  直到 14 年前
        1
  •  22
  •   Daniel    16 年前

    当主干上没有更改时,Git会进行一个快速的前向合并,只需将本地的“master”分支设置为分支上的commit。GitSvn不知道如何将快进合并提交回主干,实际上它认为“master”现在指向的是SVN分支。

    要解决此问题,请使用 git merge --no-ff 合并时。这将强制Git创建一个合并提交,然后可以将其数据提交给SVN。

        2
  •  13
  •   dyodji    14 年前

    如果你 git svn rebase 在切换回master并使用--squash之后,可以避免这种情况。

    # git checkout master
    # git svn rebase   //(<--the missing step)
    # git merge --squash mybranch // (<-- doesn't commit, more like an svn merge would do)
    ... (successful)
    # git add . 
    # git commit -m '...' 
    # git svn dcommit
    Committing to http://foo.bar/myproject/trunk...
    #
    

    解决当前状态(即,您的主机指向SVN分支)

    您可以“切换”到另一个分支,删除主分支,“切换”回该分支,然后再次合并:

    # git checkout mybranch
    # git branch -D master
    # git checkout -b master trunk
    ... continue with merge...
    # git merge --squash mybranch
    

    …你现在已经将我的分支合并到master中并准备好 commit 然后 dcommit 到 trunk

        3
  •  5
  •   VonC    16 年前

    如果你没有对大师做出任何承诺,这意味着 git merge mybranch 是一个快速前进的: master HEAD 简单地移动到 mybranch HEAD .

    这可以解释为什么 git svn dcommit 将更改推到 SVN mybranch .
    它会:

    • 首先用最后一个git更新相应的svn分支 mybranch 提交尚未提交,
    • 在SVN侧记录合并到主干
    • 然后它会在git端重新配置master(没有什么可做的,已经存在了)。

    我认为master没有更改其引用,但是如果您有疑问(并且您的工作目录是干净的),您可以(如果master当前已签出):

    git reset --hard remotes/trunk
    
        4
  •  4
  •   Walter Mundt    16 年前

    一般来说,你不应该使用 git merge 具有 git svn 因为SVN,即使有分支,也不支持Git所做的那种合并跟踪。当你需要合并一个分支时,我做了一个简单的SVN签出/合并过程,然后使用 git svn rebase 更新我的Git SVN存储库。这将保留SVN的本机合并跟踪元数据,该元数据(afaik) git-svn 完全不知道。

    我不完全确定您的SVN存储库处于什么状态——我将检查合并数据m it是否按您希望的方式在主干上进行了操作。即使是这样, 我打赌如果你看看 refs/heads/master 和 refs/remotes/trunk 文件在你的回购中,你会发现它们现在是不同的。如果是这样的话,我会(不存在本地更改)做一个 git-svn fetch 其次是 git branch -f master remotes/trunk; git reset --hard master 将git分支与git svn跟踪分支重新同步。如果您有本地更改,则必须提交并执行类似的操作 git rebase master^4 --onto remotes/trunk ,其中4是需要保留的提交数。或者,如果他们都没有承诺,把他们藏起来 git stash 第一。

    如果不能做到这一点,你可以把所有的东西都输入SVN,只需擦掉回购协议并重新结账。

        5
  •  3
  •   user1338062    14 年前

    我们已成功使用 git merge --squash 在Git SVN功能分支开发中。Git SVN的问题在于,虽然本地Git SVN克隆可以存储合并信息,但一旦您将数据传输到SVN存储库,它就会丢失。

    所以对于其他(git-)SVN用户,合并提交看起来就像普通提交。壁球和 git merge --no-ff (例如,在主服务器上生成合并提交),但它还包括在被合并的分支中进行的实际提交的列表,否则在数据提交时会丢失这些提交。

        6
  •  0
  •   Jean    14 年前

    我也遇到了同样的问题,我把遥控器/后备箱合并回了master,之后git svn info指向后备箱。

    当我离开这个项目时,我没有时间执行所有的数据,我的Gitsvnrepo和我的工作站一起死了。我确实尝试过数据传输——试运行,它说它将提交回主干。

    当我有时间的时候我会复制设置和测试

    干杯