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

如何在git svn中设置上游分支?,git,svn,git-svn,msysgit,git-bash,Git,Svn,Git Svn,Msysgit,Git Bash,在处理通常的git存储库时,本地分支通常跟踪相应的远程上游分支。通过这种方式,我可以很容易地看到,我是在上游分支的前面还是后面,因此我是否需要推动或拉动以使它们同步。而且我的提示符会立即显示这种状态,这非常方便 现在我正在使用gitsvn开发一个SVN存储库。我对克隆使用了--prefix=svn,因此git branch-r将svn/trunk列为远程分支,但是(尽管git svn rebase工作正常),它没有配置为我的主分支的上游分支 我试图手动设置跟踪信息,但失败: $ git bran

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

现在我正在使用
gitsvn
开发一个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
\uu git\u ps1
)提示符显示这些信息



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
配置。在
branchs
部分,您可以看到远程
svn
repo上的所有分支

当我需要遵循本地
git
repo中的
svn
分支时,我通常会执行以下步骤:

  • 我检查
    配置
    是否正确配置了所有
    分支
    标记
  • 我执行一个
    git svn fetch
    ,这样git将获取repo中所有分支的所有数据
  • 我检查所有
    分支
    /
    标记
    是否作为
    git branch-a
    的输出存在,例如:

    master
    prod
    scenarioParametro
    remotes/tags/alpha-1
    remotes/trunk
    
  • 我创建了一个本地git
    分支
    ,以跟踪一个远程分支,其中包括:

    git branch alpha-1 remotes/tags/alpha-1 --track
    

  • 通过这种方式,新创建的
    alpha-1
    分支将跟随
    遥控器/标签/alpha-1
    ,您可以执行
    rebase
    dcommit
    命令。

    这似乎是git 1.9中引入的一个bug,因为
    --设置为上游的
    之前的工作方式与您提到的完全相同。
    strace
    显示上游分支参考的正确位置和读数,但由于某些原因,它被忽略


    我解决这个问题的方法是手动编辑
    .git/config

    $ cat >> .git/config << EOF
    
    [branch "master"]
            remote = .
            merge = refs/svn/trunk
            rebase = true
    EOF
    
    &&
    git-config-branch.master.rebase-true
    (您仍然需要svn)

    -但不是,因为一个错误!“当然,我的
    refs/svn/trunk
    是一个分支!”你说,然后直接编辑配置(只需稍微用力)

    根据您克隆repo的方式,
    -s
    -T
    -prefix
    git svn clone的选项,
    -prefix
    ,您的svn trunk在git中的命名可能会有所不同。只需执行一个git分支-avv,然后找到正确的分支。例如,一个可能的名称是
    refs/remotes/git svn
    ;或
    refs/svn/trunk
    如上所述;甚至是别的什么


    2015年11月更新
    我仍然在git 2.1.4版上重现这一点。有人要麻烦提交错误报告吗?

    这对我使用git 1.9.5来说仍然是个问题

    我没有得到这里提到的任何解决方案,但这是有效的:

    git rebase origin/remote-branch-name
    
    之后,
    git svn dcommit-n
    显示它确实将提交到该svn分支


    更新:我又遇到了同样的问题,这一次上面的方法不起作用。我刚收到一条消息:
    当前分支主机是最新的。
    但是使用:

    git rebase -i origin/remote-branch-name
    

    无论如何都强制重新设置基础,之后上游设置正确。

    因为没有人回答这个问题:

    有没有其他简单的方法可以知道我在那个分支的前面还是后面

    是的。在本例中,您也可以使用GIT用于比较引用的一般概念。它是
    ref\u from..ref\u to

    例如:

    git log master..svn/trunk
    –将为您提供
    svn/trunk
    中缺少的所有提交。即,输入更改

    git log svn/trunk..master
    –将为您提供
    svn/trunk
    中缺少的
    master
    的所有提交。也就是说,即将离任的变化


    一般语法的进一步解释:在官方的

    No中,
    --track
    在我的存储库中不起作用。这将导致与问题中所示相同的错误消息。(无法设置跟踪信息。)它在您的存储库中真的有效吗?哪个版本的git和哪个操作系统?@michas:它对我有效,我在10个或更多的回购上使用这个过程。。。顺便说一句,linux和Git1.7.9.5。在您对回购进行了
    git svn获取
    后,您能否发布
    git branch-a
    的结果?我已经给出了问题中的
    git branch-r
    的输出
    git branch-a
    将只添加我的本地主分支。从git版本1.8.3.2.FWIW开始,跟踪远程git svn分支不再工作,我看到1.9.2中的行为与之相同,并且没有手动选择的前缀IIRC(我得到了remotes/trunk)。默认情况下,.git/config中没有主分支的条目,添加一个条目无效。svn上游分支似乎存储在其他地方。@Zitrax我不太理解你的评论。是的,一个特殊的
    .git/svn
    subdir在
    git svn
    遥控器上维护一些数据;顺便说一句,它基本上是人类可读的。但是没有,svn远程分支像往常一样存储在
    .git/refs
    中。。。您可以从上面看到,使用
    --prefix=svn
    时,trunk ref位于
    .git/refs/svn/trunk
    -注意,它不是
    git rebase origin/remote-branch-name
    
    git rebase -i origin/remote-branch-name