2009-07-15 78 views
25

我使用的git - svn的有以下工作流程现在混帐SVN工作流程 - 功能分支和合并

git clone <SVN TRUNK URL> #done once 

后来,当我在一个功能正常工作

git branch featureZ 
git checkout featureZ 
#make edits for featureZ 
git commit 

git checkout master 
git svn rebase # fetch changes from server 

git checkout featureZ #go back to branch 
#git merge master 
git rebase master #get the changes from SVN->master onto the branch now. Optional if I want the branch to be current. (EDITED: Got from the answer given below) 

#make edits for featureZ 
git commit #featureZ completed 

git checkout master 
git merge featureZ #getting featureZ onto master. Prepare to send to SVN 

git svn dcommit #push featureZ back to SVN 

现在的一些注意点,当我做功能合并到master,featureZ分支中的所有单独提交合并为一个对我来说很好。

提交消息被替换为“与featureZ合并”。这可以通过merge fmt msg修复。

现在我的问题是 有没有什么可以出错的工作流程或需要照顾。我在git-svn manual中读到,在使用git svn时不应该完成合并。我在工作流中所做的是他们所指的是什么?如果是的话,会造成什么样的问题?有一件事是我不想做一些与SVN主线混淆的东西。

+5

顺便说一句,你可以使用`git checkout -b`而不是`git branch ..; git checkout`。另外,`checkout`命令使用`co`别名是很常见的。 – jfs 2010-11-27 12:12:47

回答

26

SVN无法处理非线性历史(它根本没有它的标记)。所以你想要做的是代替合并,因为它保留了SVN的线性历史记录(这是在git-svn手册页上指出的)。

详细说明,直线(从A到B到C到D),而非线性的历史可以从(A到B到C,B到D然后C + D到E - 换句话说,它们脱落成枝条)。

重新分配会给你一个线性历史记录,应该从你的私人本地分支完成分配,例如,如果你有2个分支:master和experimental,你可以结算实验并最好做'git rebase master'与-i旗相反,这样做可能会导致不良的副作用

然后你签出master并合并来自实验分支的变化。你的历史应该保持线性。

+0

你能解释什么是非线性历史吗?另一件事是我不想(谨慎)SVN需要知道我有我合并的本地分支机构。你在哪里建议需要在工作流程中完成rebase? git rebase featureZ? – Pradeep 2009-07-15 06:24:25

+0

我详细阐述了我的答案。希望能帮助到你。 :) – 2009-07-15 06:43:20

4

你应该看看这个合并选项:

git checkout master 
git merge --squash featureZ 

将压扁的分支的所有提交到一个单一的提交上的主分支。您将有机会编辑日志消息,该消息将通过分支上完成的操作摘要进行初始化。

它的缺点是不会记录特征分支上的单个提交。此外,你只应该这样做一次,而不是在分支上做更多的工作,因为它没有被注册为适当的合并,并且任何后续的合并可能会给出不希望的结果。

2

由假代码猴子rashid给出的答案是正确的。这不是一个答案,更多的是简化。

你可以从任何git分支svn rebase/dcommit。 主人的唯一用途是,如果您有其他本地更改需要合并功能Z的更改。

git branch featureZ 
git checkout featureZ 
#bunch of changes 
git commit 
git svn rebase 
# solve any conflicts 
git svn dcommit 

如果你想保持一个干净的高手,那么你可以git svn rebase,或git merge featuresZ

0

而不是混帐SVN,你可以使用SubGit。这是一个服务器端工具,可以自动同步Subversion和Git存储库。

您可以使用任何Git工作流程和任何可用的Git客户端,无需额外的客户端工具。

考虑您的方案:

git branch featureZ 
git checkout featureZ 
# make edits for featureZ 
git commit 
git checkout master 

您可以进行如下操作:

  1. 推送特性分支完全。

    git merge featureZ 
    git push origin refs/heads/* 
    
  2. 在master/trunk之上重建一个功能分支。

    git rebase featureZ 
    git push 
    
  3. 壁球从功能分支提交。

    git merge --squash featureZ 
    git commit 
    git push 
    

只要你推变化,SubGit钩翻译更改为颠覆修订。

更多的细节:在许多方面

  • SubGit比混帐SVN更出众 - 更好的合并跟踪翻译,EOLS & MIME类型支持等
  • SubGit需要颠覆本地访问资源库(它使用自定义钩子);
  • SubGit是一个带有一些免费选项(开源和学术项目,小团队)的商业产品。