svn - Git rebase 到稍后创建的分支

标签 svn git rebase

我正在开发一个网站项目,该项目目前在 svn 中跟踪,但一旦其他人有时间设置新服务器和其他东西,我就会转移到 git。这是一个很长的故事,但与此同时,我已经用我拥有的一些代码创建了自己的 git 存储库,并对其进行了大量工作。我没有使用 git svn clone ,因为我在海外,我的互联网连接很奇怪,需要 HTTP 代理,而且它似乎不允许 git svn 通过。无论如何,我一直在自己的 git 存储库中进行开发,但最终一旦项目实际正确导入,我将需要将我的工作重新定位到 git-svn 克隆的东西上。 git rebase 能正常工作吗?

一个复杂的情况是,我实际上是在虚拟机中工作,对于许多提交,我没有意识到我没有设置 user.name 和 user.email 配置条目,因此提交来自虚拟机的本地用户,这有点奇怪。将所有更改收集到 diff 文件中,然后在创建新分支后将它们应用到新分支的顶部,这样会更好吗?

另一个复杂之处是,之前对 SVN 的使用有点三心二意,因此生产服务器上实际上存在我没有的未提交的更改。事实上,我一开始就对代码进行了较旧的修订,甚至不是 SVN 头,所以我错过了一些最重要的东西。最好的方法是什么?

最后一个问题是,如果我确实通过 git svn 导入 SVN 存储库(我刚刚检查过,它似乎现在正在工作),但我不添加作者文件,我会吗?稍后能够使用作者文件将我的更改重新设置到正确导入的分支上?

哦,一个新的并发症。我自己使用 git svn 导入了 SVN 存储库,这是一个艰苦的过程,在这种缓慢的连接上花了两天的时间。然而,最终完成克隆后,我意识到在SVN存储库中,代码都在子目录中,但在我的git存储库中,存储库的根目录也是目录的根目录。如果这有点令人困惑,它基本上是这样的

SVN:

\dir\codez

git:

\codez

如何 merge 两个存储库?我希望我仍然可以使用 rebase,但这似乎是一个非常奇怪的情况。这听起来与子模块类似,但我认为这并不是我所需要的。

最佳答案

I didn't use git svn clone because I'm overseas and my internet connection is weird and requires a proxy for HTTP

如果你设置它应该可以工作

http_proxy=http://username:passwword@pprroxyHost:proxyPort

或者你可以尝试

http_proxyUser=username
http_proxyPassword=password
http_proxyHost=aProxyHost
http_proxyPort=aProxyPort

Will git rebase work properly for this?

一般答案:是的,因为你还没有发布你的 Git 分支。
详细答案:在将结果 merge 到主分支之前,您需要先重新建立分支。请参阅this answer .
这是首选工作流程,因为它允许您在将您的分支 merge (或者如果您想保留历史记录则重新定基)到主分支之前解决您的分支中的任何冲突。
实际上,您将在下面看到创建一个特殊的“merge ”分支实际上是一个更好的主意。

hadn't realized that I hadn't set the user.name and user.email config entries

由于您尚未发布,因此您可以使用filter-branch来修改您的提交并更改用户名和电子邮件

一点 sh 脚本可以提供帮助

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        aSystemUserName) n="TheActual Name" ; m="TheActual@mailAddress" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

从您的存储库调用此脚本,您就完成了。

I had an older revision of the code in the first place that wasn't even the SVN head, so I was missing some stuff on top of that. What is the best way to proceed?

此实例中的基本工作流程是从当前工作分支创建一个新的“merge ”分支,以隔离 rebase 工作(并解决所有冲突)
在这种增量很重要的 merge 中,您必须保持工作分支干净,不包含需要进行的所有更改,以便包括:

  • 来自 SVN 的代码
  • 您没有直接从 SVN 存储库获取的代码。

will I later be able to rebase my changes onto a properly imported branch with an authors-file?

我不确定,但我确实这么认为。如果没有,只要您尚未发布任何内容,您可能需要再次使用 filter-branch 重命名脚本...

关于svn - Git rebase 到稍后创建的分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1213185/

相关文章:

SCSS 。在本地 master 之上重新设置本地分支。如何忽略单个文件更改?

git - git 的 -X "theirs"不处理新的/删除的文件冲突吗?

windows - SVN命令更新而不恢复文件

svn - 为什么我可以从命令行连接到 svn 但不能从 tortoise 连接到 svn?

git cherry-pick 到另一个分支

linux - 在 bash 脚本中使用修改后的变量,尝试以编程方式更改 git 分支

svn - 如何使用新的 doxygen 输出最小化修订之间的更改数量?

svn - 如何使用 SharpSVN 以编程方式为文件夹设置 "add to ignore list"

git - 如果我中断 git add 命令会发生什么?

git - 你如何从 "autostash"获得丢失的 `git rebase --autostash` 提交