如何同步git-svn仓库

4

我过去三周一直在使用git-svn。

目前我的工作流程如下:

  1. ssh进入我的开发机,
  2. 在那里创建/编辑/删除文件(git svn rebase, git checkout -b topic branch),
  3. 检查web应用程序是否正常运行。
  4. 提交到svn。(git rebase master, git checkout master, git merge topic branch, git svn dcommit)

问题

  1. 这个工作流程对于在dev box(ssh)上进行快速编辑非常容易。但随着远程编辑变得越来越慢,它变得困难了。
  2. 注意:我不能在本地机器上设置与我的Web应用程序完全相同的副本(因为它从各种来源获取数据,并且有很多其他配置)。

我想要的是在本地编辑文件,将文件移动到服务器上,测试并提交。

有什么好的工作流程可以实现这一点吗?

我以前尝试过的包括:

  1. 本地编辑文件,scp文件,测试,dcommit
  2. 本地编辑文件,rsync与dev box,测试,dcommit
  3. 本地编辑文件,git push到dev box,测试,dcommit(git从本地框到dev box中不可能拉取,因为本地框在路由器后面)

我还没有尝试最后一步,因为git-svn提到如果你正在使用git-svn,从另一个git repo推/拉/合并是危险的。

请问您能否提供一些有效的工作流程和示例命令?

谢谢

2个回答

3

也许我错过了什么,但我认为git svn文档中的警告不适用于我下面建议的工作流程。(顺便说一下,我假设您只想从开发机器上执行git svn dcommit。)

  1. Clone the repository from your dev box onto your local machine. Suppose you then create a new topic branch locally called excellent. You do some work on that new branch.

  2. Now you want to test it on the dev box, but to avoid the problems with pushing into a non-bare repository you can use a technique suggested in the git FAQ where you push directly to a ref under refs/remotes/. For example, you might do:

    git push origin excellent:refs/remotes/from-desktop/excellent
    
  3. Now you should log in to the dev box. You can then create a new branch based on the ref you just pushed with git checkout -b excellent from-desktop/excellent

  4. You can work on this branch as you would on the topic branch in your example, and if you're happy with it, make sure that you still do the same sequence before doing a git svn dcommit, i.e. git rebase master, git checkout master, git merge excellent, git svn dcommit

我不明白为什么这个工作流程会对 git svn 造成问题,因为你在做 git svn dcommit 之前已经小心地将你的工作变基并合并到 master 分支了。


在第三步进行更改后,我该如何将这些更改应用到我的本地机器上?从我的本地机器上执行 git pull 命令?例如:git pull origin excellent 是否可行? - someisaac
@someisaac:如果你正在尝试在dev box上将你的更改重新应用到“excellent”分支,请使用“git pull --rebase origin excellent”,否则就会出现一个合并,其中同一份更改的历史记录会出现在两个父分支中。 - Mark Longair
我还有一个疑问。在执行 git pull --rebase origin excellent 命令并在本地进行一些更改后,如何将这些更改应用到开发环境中?我尝试再次执行 git push origin excellent:refs/remotes/from-desktop/excellent 命令,它成功了,但是我该如何将这些更改合并到 devbox 仓库的 excellent 分支中呢?我尝试使用 git merge excellent from-desktop/excellent 命令,但是会创建一个合并提交。 - someisaac
太好了,我很高兴听到那个起作用了。但是如果你的最终目标是将你的提交放入svn中,那么大量的变基基本上是不可避免的。 - Mark Longair

1

我使用的工作流与你的相反,而且效果很好。

所谓相反,就是我的git-svn仓库在本地机器上,然后我将其推送到开发机上。

有三个仓库:

  1. 本地机器上的git-svn仓库。
  2. 我在开发机上创建了一个裸仓库,然后从git-svn仓库中推送到这个裸仓库。
  3. 在开发机上,我克隆了裸仓库到一个用于测试的工作目录。在创建仓库后,我会从上述第2步中描述的裸仓库中拉取。

我很少在测试仓库(#3)中进行编辑。如果我确实进行了一些微小的编辑,我通常会手动在本地机器上的仓库(#1)上进行相同的编辑。偶尔,我会将测试仓库(#3)中的提交推送回裸仓库(#2),然后从本地机器上的git-svn仓库(#1)中拉取它们。更常见的情况是,当我在寻找难以找到的错误并进行一系列小的更改时,我会直接在测试仓库(#3)中修复该错误,并将所有这些调试更改都丢弃掉。然后,我会直接在git-svn仓库(#1)中修复该错误,然后推送到#2,从#2拉取到#3进行测试。

工作流程如下:

  1. [本地] git co -b myfeature
  2. [本地] 编写代码
  3. [本地] git commit -m'did stuff' -a
  4. [本地] git push devbox myfeature
  5. [开发环境] cd myapp; git pull; git co origin/myfeature
  6. [开发环境] 进行测试
  7. 重复步骤2-6
  8. [本地] git co master
  9. [本地] git svn rebase
  10. [本地] git co myfeature
  11. [本地] git rebase master
  12. [本地] git co master
  13. [本地] git merge --ff-only myfeature
  14. [本地] git svn dcommit
  15. [本地] git br -d myfeature

有时在第8步之前,我会进行交互式变基以清理历史记录。


开发者工作站上有一个裸仓库,以及带有应用程序检出的工作区。"带有应用程序检出的工作区"是指您从裸仓库克隆应用程序吗?您能详细说明一下吗? - someisaac
当你需要在devbox(快速编辑)中进行编辑时,您会怎么做?您提交并推送到裸仓库?还有从本地框执行svn dcommit?如果我想要另一台本地机器(如笔记本电脑),应该怎么办? - someisaac
@someisaac - 为了更清晰,我进行了修改,请告诉我您是否还有疑问。关于使用另一台本地机器:请注意引入另一个repo所带来的复杂性。每件事都必须返回到svn,并且您想要维护一个漂亮的线性历史记录。您可以在笔记本电脑上创建一个新的git-svn repo,或者可以克隆我答案中描述的#1 repo。在这种情况下,您将不得不弄清楚如何最好地同步到dev box。 - bstpierre
谢谢,我会尝试这个方法并且如果有任何问题会告诉你。 - someisaac
您的工作流程很有趣,就我尝试而言,它运行良好。但是目前我正在使用@Mark Longair建议的方法。谢谢。 - someisaac

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