git - 你如何 rebase git-svn 分支并保持元数据完整?

标签 git git-svn git-branch

我最近使用了git svn branch创建一个分支(在 Subversion 和 git 中)。

我注意到(出于某种原因我不确定;可能是一个错误,或者我可能错误地创建了分支?)用于创建分支的 git commit 有两个父项:一个在树的顶部我创建了分支(不正确,因为我从以前的修订版分支出来)和一个(预期的)以前的修订版。

这个“第二个 parent ”给我带来了各种各样的悲伤,因为我现在正试图从另一个分支 merge 到新分支,而 git 的共同祖先的想法是不正确的。

我找到了 this question这解释了如何通过使用 rebase 来强制 git 分支拥有正确的父分支。问题是,rebase 只影响我的本地分支 HEAD,而不是绑定(bind)到 git-svn 存储库的远程。通常,这将是一件非常糟糕的事情,但由于我是唯一一个使用此 git-svn 存储库的人,所以我不在乎:我现在只想将远程分支移动到调整后的提交。

所以我的问题是:现在我已经让本地分支的父级指向它分支的正确提交,有没有办法让我将远程分支移动到同一个 HEAD,这样我就可以 (例如)运行 git svn rebase没有混淆? (恐怕如果我手动更改它,.git/refs/remotes/<mybranch>/.rev_map... 文件将不再与 SVN 匹配......?)


编辑:为了解决评论中提出的问题,是的,该分支已 checkout 。我将更改我的分支机构的名称以保护无辜者,但让我们想象一下它看起来像这样:

$ git branch
* git_mysvnbranch
  git_releasebranch
  master

$ git branch -r
  trunk
  mysvnbranch
  releasebranch

现在,当我创建分支时,mysvnbranch有两个主干的 parent ,以及我分支的主干的任意点。现在我想拿releasebranch并将其 merge 到 mysvnbranch ,这是我看到问题的时候。如果我启动 gitk它看起来像这样:

o [git_mysvnbranch] [remotes/mysvnbranch]
|\ <--- bad pointer here
| o [remotes/trunk]
| |
| o 
| | o [git_releasebranch] [remotes/releasebranch]
| | |
| o o
| |/
| o
| |
| o
| |
| o
|/
o [arbitrary branch point]

所以如果我想在 [remotes/releasebranch] 中 merge ,你可以看到问题.如果我做一个 rebase ,我可以让它看起来像这样:

o [git_mysvnbranch]
|
| o [remotes/mysvnbranch]
| |\ <--- bad pointer here
| | o [master] [remotes/trunk]
| | |
| | o 
| | | o [git_releasebranch] [remotes/releasebranch]
| | | |
| | o o
| | |/
| | o
| | |
| | o
| | |
| | o
| |/
|/
o [arbitrary branch point]

现在我想删除 [remotes/mysvnbranch] 的版本和坏 parent 一起,让它指向哪里[git_mysvnbranch]指向而不是。

但我刚刚发现一件奇怪的事情:svn 元数据可能确实完好无损。我刚刚这样做了:

$ git svn rebase -n
Remote Branch: refs/remotes/mysvnbranch
SVN URL: svn://subversionrepo/branches/mysvnbranch

所以也许我什么都不担心。我将对此进行更多测试以找出答案。


编辑 2:我什么都不担心。我一试git svn rebase从 rebased 分支,它试图重新 merge 已经 merge 到 git 分支的更改。

最佳答案

在经历了很多痛苦之后,我找到了一种解决方法,但这不是一个很好的方法:

$ svn copy -r <arbitrary-branch-point> svn://subversionrepo/trunk \ 
                                       svn://subversionrepo/branches/mysvnbranch2

也就是说,我放弃并重新创建了一个不同名称的分支。 (为了安全起见,使用 Subversion 客户端。)然后我做了一个 git svn fetch --all。我想我可以将我的工作重新定位到新分支并结束工作。当我检查 gitk 时,新分支基于正确的修订版。

我希望有人知道更好的解决方法,因为我认为这不会为遇到同样问题的每个人所接受。

仅供引用,我认为发生这种情况是因为在我开始之前错误地创建了一个具有相同名称的分支然后将其删除。这可能混淆了 git-svn。

关于git - 你如何 rebase git-svn 分支并保持元数据完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6365938/

相关文章:

version-control - 如何撤消 git svn dcommit?

git - 如何删除已发布的分支而不在 github 控制台上创建 pull 请求

windows - git 和 subversion 可以一起玩吗?

Git:在 rebase 失败后恢复分歧的存储库

git-svn 错误导入存储库 : fatal: Not a valid object name

git - 将 svn 镜像到 git 的想法

git - 如何让 git-push 永久跳过详分割支的提交?

git - 如何在没有 --set-upstream 的情况下推送远程服务器上不存在的新分支?

由多个存储库组成的 Docker 应用程序的 Git 存储库设置

git - 一切都是最新的(一切都不是)