【发布时间】:2012-10-20 06:53:30
【问题描述】:
我已经设置了一个基于Adam Spiers' answer in a previous SO thread 的流程,用于定期将 Git 存储库发布到 SVN 存储库中的路径。一切都很好,但有一件我还没有弄清楚。当我使用cherry-pick 获取后续 Git 更改时,我如何确定在此 Git 端发生了哪些新更改,需要将其挑选到 SVN 端?
更具体地说,在我将 Git 历史记录初始推送到 SVN 之后,我现在坐在 master 分支上,该分支与 Git 起源具有相同的内容和补丁历史记录,但与 @ 不同987654324@ 基本上是它的全部历史:
% git --no-pager diff master git-svn
% git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 2 different commit(s) each, respectively.
#
nothing to commit (working directory clean)
现在,我获取新的上游更改:
% git fetch
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /cygdrive/c/foo/git/testrep
6d7dd94..08d3d19 master -> origin/master
在这一点上,我需要弄清楚哪些修订需要精心挑选,然后我会挑选它们并执行git svn dcommit。但我不知道如何获得樱桃清单。我尝试了各种 git cherry 命令,git cherry origin master 和 git cherry master origin 都报告了长长的列表,基本上每边的每一个变化。
我应该求助于解析日志文件中的最后一个樱桃挑选吗?我用的是git cherry-pick -x,所以我确实有记录。
【问题讨论】:
-
你试过简单的
rebase --onto吗? Git 应该足够聪明,能够找出与补丁等效的提交,并删除已经为您的 SVN 分支选择的所有内容。 -
我没有看到它工作 - 如果我先做
git fetch origin然后git rebase --onto git-svn origin,当我希望看到 2 个新提交重新设置时,似乎什么都没有发生。另外,如果我有成百上千的提交,这种方法会变得笨拙吗? -
尝试类似
git rebase --onto git-svn <last picked/rebased commit from origin/master> <origin/master>的方法。也许与-i/--interactive结合使用 -
如果你能提供一个简化的测试用例,那将非常有帮助。
-
@Adam,您的意思是要查看的实际存储库吗?我认为我执行的所有步骤都在这里和上一个线程中。
标签: git svn cherry-pick