2

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

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

另一个复杂情况是,之前使用 SVN 有点半心半意,所以在生产服务器上实际上存在我没有的未提交更改。实际上,我首先有一个旧版本的代码,它甚至不是 SVN 头,所以我错过了一些东西。最好的方法是什么?

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

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

SVN:

\dir\codez

混帐:

\codez

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

4

3 回答 3

5

我没有使用 git svn clone 因为我在海外,而且我的互联网连接很奇怪,需要 HTTP 代理

如果你设置它应该工作

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

或者你可以试试

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

git rebase 会为此正常工作吗?

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

没有意识到我没有设置 user.name 和 user.email 配置条目

由于您还没有发布,您可以使用 afilter-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"
'

从你的仓库调用这个脚本,你就完成了。

我首先有一个旧版本的代码,它甚至不是 SVN 头,所以我错过了一些东西。最好的方法是什么?

这种情况下的基本工作流程是从您当前的工作分支创建一个新的“合并”分支,以隔离变基工作(并解决所有冲突)
在这种增量很重要的合并中,您必须保持工作从您需要进行的所有更改中清除分支,以包括:

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

以后我能否将我的更改重新定位到带有作者文件的正确导入的分支上?

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

于 2009-07-31T15:48:52.603 回答
1

git-rebase取决于在历史的某个地方有一个共同的提交。它也发生在单个存储库中。听起来您最终会遇到以下情况:(a)新的 git-svn 导入的 repo 与您的分开,并且(b)两者之间不会有共同的提交。你可能最终需要通过补丁来做到这一点,但 git 可以帮助你。查看git-format-patch和的手册页git-am。第一个可以从一系列提交中生成一系列补丁,第二个可以获取这一系列补丁并应用它们 - 所有提交消息等都将被保留。

这将为您提供修复您的用户名/电子邮件问题的机会 - 您可以简单地在补丁的标题中修改它们,并确保在应用补丁之前在新导入的存储库中正确设置它们!

处理您过时的起始位置(“旧版本......甚至不是 SVN 头”)的最佳方法可能是:

  • 使 SVN 存储库进入良好状态,所有更改都已提交
  • 用 git-svn 导入
  • 在您开始工作的旧提交处创建并签出分支
  • 应用你的补丁系列
  • 把这个分支合并到master中,对应当前的SVN头

对我来说很幸运,但对你来说不是那么幸运,我从来不需要使用 git-svn,所以我无法明确回答你的作者文件问题。但是,如果我理解正确,作者文件会将 SVN 作者翻译成 git 作者。如果作者在 git 提交上发生更改,则哈希将更改。因此,重要的是不要弄乱这个转换表,并在第一时间把它弄好。

这里有很多问题,所以如果我错过了什么,请随时发表评论并提出更多问题。

于 2009-07-31T15:50:06.140 回答
0

您可以使用低级工具创建新的未出生分支:

$ git symbolic-ref HEAD refs/heads/new_branch

--root使用现代 git,您可以使用“git rebase”选项对整个分支进行rebase。

这可能会或可能不会对您的情况有所帮助。YMMV。

于 2009-07-31T18:11:32.923 回答