git-svn:为master重置跟踪

Phi*_*ham 28 svn git merge git-svn

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

最近我一直在研究使用git-svn branch myremotebranch和检出的分支git checkout --track -b mybranch myremotebranch.我需要在多个位置工作,所以从分支I git-svn dcommit-ed文件定期到SVN存储库.

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

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

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

有没有办法可以更新主服务器,以便它remotes/trunk在合并之前跟随?

我正在使用git 1.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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iel 22

当主干上没有变化时,git会进行快进合并,只需将本地"主"分支设置为分支上的提交即可.Git-svn不知道如何将快进合并提交回trunk,实际上它认为"master"现在指向svn分支.

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

  • 我不认为创建一个新的合并提交将有助于澄清问题,因为合并信息将无论如何传播到svn存储库时将丢失. (2认同)

dyo*_*dji 13

如果您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...
#
Run Code Online (Sandbox Code Playgroud)

解决当前状态(即主服务器指向SVN分支)

你可以'切换'到另一个分支,删除master,'切换'回到它,然后再次合并:

# git checkout mybranch
# git branch -D master
# git checkout -b master trunk
... continue with merge...
# git merge --squash mybranch
Run Code Online (Sandbox Code Playgroud)

...你现在将mybranch合并为主人并准备好commit然后 dcommit再到trunk

  • 我不认为`git checkout -b master trunk`是正确的.它应该是`git checkout -b master remotes/git-svn` (2认同)

Von*_*onC 5

如果你没有对master进行任何提交,那就意味着它git merge mybranch是一个快进的提交:master HEAD只需转移到mybranch HEAD.

这可以解释为什么git svn dcommit推动你的改变SVN mybranch.
它会:

  • 首先使用mybranch尚未提交的最后一个Git 提交更新相应的SVN分支,
  • 在SVN端记录合并到trunk
  • 然后它会在Git方面改变主人(无所事事,已经存在).

我不认为master没有改变它的引用,但是如果你有疑问(并且你的工作目录是干净的),你可以(如果master当前已经检出):

git reset --hard remotes/trunk
Run Code Online (Sandbox Code Playgroud)