如何在一次操作中进行git svn fetch + rebase?

9
我刚刚发现,尽管在git help svn中的rebase部分说:

这个命令获取当前HEAD的SVN父级版本,并将当前(未提交到SVN)的工作与之合并。

(我强调了一下)但是这并不意味着rebase包括git svn fetch。抛开命名不谈,有没有一种方法可以运行一个git svn命令来同时完成两者?

我想这样做的原因是我只在一个分支上写作,所以我想对那一个分支进行rebase,而我经常阅读其他分支,所以我想fetch它们。


我对 git svn 没有经验,但普通的 git pull 可以配置为使用 rebase 而不是 merge,这样可以完成你想要的两个步骤。如果我知道如何在 git svn 中执行相当于 git config branch.autosetuprebase always 的操作,我会发布一个答案。 - Daniel Böhmer
这意味着只要尝试一下。首先它会获取,然后再进行变基。 - the.malkolm
2
不,它不会。git svn rebase 不会从远程获取新的分支,而 git svn fetch 会。我刚试过了。 - l0b0
4个回答

23

我认为你混淆了git rebasegit svn rebase。前者将提交移到你指定的修订版上,而后者将当前HEAD移动到你所在的Subversion分支的末端。

git svn rebase确实包括一个git svn fetch --parent,也就是说它会获取你当前所在分支上的任何新的Subversion提交,但不会获取来自其他分支的Subversion提交(与普通的git svn fetch相比,后者会从所有分支中获取)。

我猜想你在做git svn rebase时不想执行完整的git svn fetch,因为这意味着在你获取可用工作副本之前需要更长时间。如果你想要定期执行git svn fetch,我建议设置一个cron job在后台为你完成fetch操作。


虽然这是一篇旧文章,但我仍认为其非常相关。在执行 git svn rebase 命令之前,我绝对希望获取所有分支更新。为什么?因为如果不这样做,合并时会出现许多问题。很容易忘记提取每个要合并的分支,然后执行 git svn rebase && git checkout master && git merge feature,最后才意识到没有从 SVN 更新正确的分支。如果使用 git svn 支持更好的分支管理,始终 git svn fetch 所有内容再进行变基是有道理的。如果不这样做,git svn dcommit 将覆盖一切。 - Andrew T Finnell
如果 SVN 存储库中有太多分支,而且需要很长时间,那么请从“branches:”配置行中删除“*”,并仅处理通常使用的分支。如果您正在执行“master->dev->feature”组合,则可以使用通配符和 git 配置文件轻松处理仅这些分支。这样,当您执行“git svn fetch”时,就不会获取不必要的分支。因为“git svn rebase”在事先不获取分支,所以它曾经完全破坏了我的 git 和 svn 存储库。对我来说,这种方式不好理解。也许只有我觉得如此。 - Andrew T Finnell

8

听到这实际上是它的行为方式,我也有点惊讶。 但是,回答您的问题,您只需要定义一个别名:

git config --global alias.refetch '!git svn fetch && git svn rebase'

然后,git refetch 就可以完成你想要的操作。


好的,看起来没有标准的方法来做这件事。 - l0b0
你为什么要获取所有的svn仓库来为单个仓库进行rebase呢? - the.malkolm
@l0b0:没有标准的方法来做这件事,因为这不是使用git svn的标准方式。git svn rebase旨在将您当前的分支更新到Subversion的最新版本,因此忽略了任何其他Subversion分支,以便快速获取有用的工作副本。git svn fetch会从Subversion存储库更新所有内容,因此通常是一个更慢的操作。我真的很困惑您实际上想要实现什么,这意味着您需要能够这样做。 - me_and
1
为了让意图更加清晰,可以使用alias.svnfetch甚至alias.svnfetchall。这样就清楚地表明了SVN被用作传入提交的源。一开始我对svn rebase的工作方式感到困惑,特别是考虑到没有SVN的git的典型工作流程。在合并之前,很容易忘记在每个分支上执行svn fetch然后svn rebase。也许我漏掉了什么。 - Andrew T Finnell

0

我不知道在这个问题被提出的时候是否可能,但我认为 git svn rebase 等同于 git svn fetch --parent ; git rebase git-svn。至少对我来说是这样的。似乎 git svn 创建了一个名为 git-svn 的假分支,可以使用 git 进行交互。但是,该分支不能仅通过 git 进行修改。

如果您想要完整的 fetchrebase,则应调用 git svn fetch ; git rebase git-svn

换言之,根据别名(就像被接受的答案所示):git config --global alias.refetch '!git svn fetch && git rebase git-svn'


-4
git pull --rebase

你也可以配置它默认为变基。那么你可以:
git pull

更新:

哎呀,需要更多的咖啡...

我能想到的就是编写你所需的脚本...


1
@AdamDymitruk:这不是关于普通的git - 而是关于git svn - l0b0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接