如何在git-svn中设置上游分支?

时间:2014-03-06 15:44:05

标签: git svn git-svn msysgit git-bash

在处理通常的git存储库时,本地分支通常会跟踪相应的远程上游分支。通过这种方式,我可以很容易地看到,无论我是在我的上游分支的前面还是后面,因此我需要推或拉来使它们同步。此外,我的提示立即显示此状态,这非常方便。

现在我正在使用git-svn开发SVN存储库。我使用--prefix=svn作为克隆,因此git branch -rsvn/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

4 个答案:

答案 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如上;甚至是别的什么。


2015年11月更新

我仍在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分支,我通常会执行以下步骤:

  1. 我检查config是否已正确配置了所有branchestags
  2. 我做git svn fetch,这样git将获取所有分支的repo中的所有数据
  3. 我会检查所有branches / tags是否都显示为git branch -a的输出,例如:

    master
    prod
    scenarioParametro
    remotes/tags/alpha-1
    remotes/trunk
    
  4. 我创建了一个本地git branch来跟踪远程的:{/ p>

    git branch alpha-1 remotes/tags/alpha-1 --track
    
  5. 通过这种方式,新创建的alpha-1分支将跟随remotes/tags/alpha-1,您可以执行rebasedcommit命令。

答案 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 –将为您提供mastersvn/trunk中所有未完成的提交。即 外向更改

有关常规语法的进一步说明:here on SO和官方GIT documentation