繁体   English   中英

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

[英]How to set upstream branch in git-svn?

在使用常规git存储库时,本地分支通常会跟踪相应的远程上游分支。 通过这种方式,我可以轻松地看到自己是在上游分支的前面还是后面,以及是否需要推动或拉动它们以使其同步。 另外,我的提示会立即显示此状态,这非常方便。

现在,我正在使用git-svn在SVN存储库中工作。 我为克隆使用了--prefix=svn ,因此git branch -rsvn/trunk列为远程分支,但是(尽管git svn rebase可以正常工作),但没有将其配置为我的master分支的上游分支。

我尝试手动设置跟踪信息,但失败了:

$ 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

这似乎是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中的名称可能不同,具体取决于您克隆存储库的方式( git svn clone -s-T ,-- --prefix选项)。 只需执行git branch -avv并找到正确的git branch -avv 例如,一个可能的名称是refs/remotes/git-svn 或上面的refs/svn/trunk 甚至其他的东西。


2015年11月更新

我仍然在git version 2.1.4上重现此内容。 有人要提交错误报告吗?

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 repo中遵循svn分支时,通常会执行以下步骤:

  1. 我检查config是否正确配置了所有branchestags
  2. 我执行git svn fetch ,这样git将为所有分支取回仓库中的所有数据。
  3. 我检查所有branches / tags是否作为git branch -a输出存在,​​例如:

     master prod scenarioParametro remotes/tags/alpha-1 remotes/trunk 
  4. 我创建一个本地git branch来跟踪具有以下内容的远程branch

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

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

这对我使用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

无论如何都强制重新设置基准,然后正确设置了上游。

由于没有人回答:

还有其他简单的方法可以知道我在该分支机构之前还是之后吗?

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

例如:

git log master..svn/trunk –将为您提供svn/trunk中所有master丢失的提交。 迎接变化

git log svn/trunk..master –将为您提供svn/trunk中缺少的所有master提交。 外向的变化

通用语法的进一步说明: 在此处以及官方GIT文档中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM