在处理通常的git存储库时,本地分支通常会跟踪相应的远程上游分支。通过这种方式,我可以很容易地看到,无论我是在我的上游分支的前面还是后面,因此我需要推或拉来使它们同步。此外,我的提示立即显示此状态,这非常方便。
现在我正在使用git-svn
开发SVN存储库。我使用--prefix=svn
作为克隆,因此git branch -r
将svn/trunk
列为远程分支,但是(虽然git svn rebase
没有问题)但它没有配置为我的上游分支主分支。
我尝试手动设置跟踪信息,但失败了:
$ git branch -r
svn/trunk
$ git branch --set-upstream-to=svn/trunk
fatal: Cannot setup tracking information; starting point 'svn/trunk' is not a branch.
有没有办法跟踪svn上游分支?
还有其他一些简单的方法可以知道我是领先还是落后于那个分支? (看gitk --all
目前是我所知道的唯一方式。)
是否有某种方法可以让我的(bash __git_ps1
)提示显示该信息?
$ git --version
git version 1.9.0.msysgit.0
答案 0 :(得分:3)
这似乎是git 1.9中引入的一个错误,因为--set-upstream-to
之前就像你提到的那样工作
并且strace
显示正确定位和读取上游分支ref,然后由于某种原因忽略它。
此问题的解决方法是.git/config
的手动修改:
$ cat >> .git/config << EOF
[branch "master"]
remote = .
merge = refs/svn/trunk
rebase = true
EOF
- 应等同于:
git branch --set-upstream-to=svn/trunk master
&安培;&安培; git config branch.master.rebase true
(无论如何你还想要svn)
- 但不是,因为一个错误! &#34;当然我的refs/svn/trunk
是一个分支!&#34;你说,然后直接编辑配置(只需要一点点轻柔的力量)。
您的svn主干在git 中的名称可能不同,具体取决于您如何克隆回购邮件(-s
,-T
,--prefix
选项到{{1} })。只需做一个git svn clone
并找到正确的一个。例如,一个可能的名称是git branch -avv
;或refs/remotes/git-svn
如上;甚至是别的什么。
我仍在refs/svn/trunk
上重现这一点。有人打扰提交错误报告吗?
答案 1 :(得分:2)
git-svn
会将配置数据存储在.git/config
中,例如在我的一个repo中配置就像:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
url = http://svn.repo.com/repos/myrepo
fetch = trunk:refs/remotes/trunk
branches = branches/*:refs/remotes/*
tags = tags/*:refs/remotes/tags/*
在[svn-remote "svn"]
部分,您可以看到所有git-svn
个配置。在branches
部分,您会看到远程svn
个回购邮件中的所有分支。
如果我需要在我的本地svn
回购邮件中关注git
分支,我通常会执行以下步骤:
config
是否已正确配置了所有branches
和tags
。git svn fetch
,这样git将获取所有分支的repo中的所有数据我会检查所有branches
/ tags
是否都显示为git branch -a
的输出,例如:
master
prod
scenarioParametro
remotes/tags/alpha-1
remotes/trunk
我创建了一个本地git branch
来跟踪远程的:{/ p>
git branch alpha-1 remotes/tags/alpha-1 --track
通过这种方式,新创建的alpha-1
分支将跟随remotes/tags/alpha-1
,您可以执行rebase
和dcommit
命令。
答案 2 :(得分:1)
对于我来说,使用git 1.9.5仍然是个问题。
我没有得到这里提到的任何解决方案,但这有效:
git rebase origin/remote-branch-name
之后git svn dcommit -n
表明它确实会提交给那个svn分支。
更新:我又遇到了同样的问题,这次上面的工作没有用。我刚收到消息:Current branch master is up to date.
但是使用:
git rebase -i origin/remote-branch-name
无论如何都强制使用rebase,之后上游设置正确。
答案 3 :(得分:0)
由于没有人回答:
还有其他简单的方法可以知道我在该分支机构之前还是之后吗?
是的。在这种情况下,您也可以使用GIT用于比较引用的一般概念。它是ref_from..ref_to
例如:
git log master..svn/trunk
–将为您提供svn/trunk
中缺少的master
中的所有提交。即 传入更改。
git log svn/trunk..master
–将为您提供master
中svn/trunk
中所有未完成的提交。即 外向更改。
有关常规语法的进一步说明:here on SO和官方GIT documentation