如何在git svn中设置上游分支?
在处理通常的git存储库时,本地分支通常跟踪相应的远程上游分支。通过这种方式,我可以很容易地看到,我是在上游分支的前面还是后面,因此我是否需要推动或拉动以使它们同步。而且我的提示符会立即显示这种状态,这非常方便 现在我正在使用如何在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
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 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