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

Posted

技术标签:

【中文标题】如何在 git-svn 中设置上游分支?【英文标题】:How to set upstream branch in git-svn? 【发布时间】:2014-04-09 08:50:25 【问题描述】:

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

现在我正在使用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

【问题讨论】:

FWIW,我看到与 1.9.2 相同的行为并且没有手动选择的前缀 IIRC(我有一个遥控器/主干)。 【参考方案1】:

git-svn 会将配置数据存储在.git/config 中,例如在我的一个仓库中,配置如下:

[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 存储库上的所有分支。

当我需要关注本地 git 仓库中的 svn 分支时,我通常会执行以下步骤:

    我检查config 是否正确配置了所有branchestags。 我做了一个git svn fetch,这样 git 将获取所有分支的 repo 中的所有数据

    我检查所有branches / tags 都作为git branch -a 的输出出现,例如:

    master
    prod
    scenarioParametro
    remotes/tags/alpha-1
    remotes/trunk
    

    我创建了一个本地 git branch 来跟踪远程:

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

这样新创建的alpha-1 分支将跟随remotes/tags/alpha-1,您可以执行rebasedcommit 命令。

【讨论】:

不,--track 不适用于我的存储库。它将导致与问题中所示相同的错误消息。 (无法设置跟踪信息。)它真的适用于您的存储库吗?哪个版本的 git 和哪个操作系统? @michas:它对我有用,我在 10 个或更多 repos 上使用这个过程......顺便说一句,linux 和 git 1.7.9.5。在您的回购中执行git svn fetch 之后,您能否发布git branch -a 的结果? 我已经在问题中给出了git branch -r 的输出。 git branch -a 只会添加我的本地 master 分支。 跟踪远程 git-svn 分支不再适用于 Git 版本 1.8.3.2。【参考方案2】:

这似乎是 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)

——但不是,因为一个错误! “当然我的refs/svn/trunk一个分支!”你说,然后直接编辑配置(只需一点点温和的力量)。

您的 svn 主干在 git 中的命名可能不同,具体取决于您克隆 repo 的方式(-s-T--prefix 选项为 git svn clone)。只需执行git branch -avv 并找到正确的。例如,一个可能的名称是refs/remotes/git-svn;或refs/svn/trunk 同上;甚至是别的东西。


2015 年 11 月更新

我仍然在git version 2.1.4 上复制此内容。有人麻烦提交错误报告吗?

【讨论】:

默认情况下,.git/config 中没有 master 分支的条目,添加一个没有效果。 svn 上游分支似乎存储在其他地方。 @Zitrax 我不太明白你的评论。 是的,一个特殊的.git/svn 子目录确实维护了git-svn 遥控器上的一些数据;顺便说一句,它主要是人类可读的。然而没有,svn 远程分支像往常一样存储在.git/refs...你可以从上面看到--prefix=svn 的主干引用在.git/refs/svn/trunk 中——注意它不是 .git/svn/... 任何东西。这只是一个普通的 git ref。此外,如图所示编辑了.git/config,我确实在git status 中看到了所需的Your branch is up-to-date with 'svn/trunk'。哦,“svn 上游分支”是什么意思? “svn 上游分支”是指运行 git svn dcommit 时更新的 svn 分支。按照您上面的建议编辑 .git/config 不会改变 dcommit 对我的影响。但是,当我在下面的回答中使用git rebase ... 时,我确实看到了变化。我可能误解了它的工作原理,或者这是一个不同的问题 - 但我的问题似乎只能通过我给出的答案来解决。 @Zitrax 配置上游分支(通过git branch --set-upstream-to 如 OP 所示,或通过 等效 编辑 .git/config 如上所述)不应该 影响git svn dcommit 的去向(它确实会影响git push 的去向——但在 git-svn 中不使用)。你肯定对它是如何工作的感到困惑。特别是,盲目地变基不会对您有太大帮助。 man git-svn: ...注意以下规则: git svn dcommit 将尝试在git log --grep=^git-svn-id: --first-parent -1 中命名的SVN 提交之上提交git-svn-id 标签确定dcommit 的去向。 对,如果它仅基于提交消息中的git-svn-id:,那么我理解。我想当我改变基础时,我可以在下次遇到问题时验证。但是,由于我已经有了解决问题的方法,所以我没有什么可以解决的了 - 我只是好奇为什么我们有不同的解决方案。【参考方案3】:

这对使用 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,然后上游设置正确。

【讨论】:

【参考方案4】:

由于没有人回答这个问题:

还有其他简单的方法可以知道我是领先还是落后于那个分支?

是的,是的。在这种情况下,您也可以使用 GIT 用于比较 refs 的一般概念。是ref_from..ref_to

例如:

git log master..svn/trunk - 将为您提供来自svn/trunk 的所有在您的master 中缺失的提交。 IE。 即将进行更改

git log svn/trunk..master - 将为您提供来自master 的所有在svn/trunk 中缺失的提交。 IE。 即将发布的更改

一般语法的进一步解释:here on SO和官方GIT documentation

【讨论】:

以上是关于如何在 git-svn 中设置上游分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GitHub.com 中设置默认分支?

Git:如何在我的项目中设置一个与远程分支相同的文件夹?

如何解决与 git-svn 的冲突?

如何使 git 分支的上游引用为只读?

git如何将上游(upstream)新建分支(origin没有)导入到origin中?

git-svn 使用啥 svn 客户端?