27

我现在正在使用带有以下工作流程的 git-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

现在,当我将功能 git 合并到 master 上时,需要注意一些要点,featureZ 分支中的所有单独提交都会合并为一个,这对我来说很好。

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

现在我的问题是这个工作流程是否有任何问题或需要注意。我在git-svn 手册中读到使用git svn时不应该进行合并。我在工作流程中所做的是他们所指的吗?如果是这样会导致什么样的问题?一件事是我不想做一些与 SVN 主线混淆的事情。

4

4 回答 4

27

SVN 不能处理非线性历史(它根本没有它的符号)。所以你想要做的是一个变基而不是一个合并,因为它保留了 SVN 的线性历史(这在 git-svn 手册页中有说明

详细地说,线性历史是微不足道的。他们走直线(A 到 B 到 C 到 D)。而非线性历史可以从(A 到 B 到 C,B 到 D,然后 C + D 到 E——换句话说,它们从萌芽到分支)。

变基将为您提供线性历史记录。请记住,应该从您的私有本地分支完成变基。例如,如果您有 2 个分支:主分支和实验分支。您将结帐实验并最好使用 -i 标志执行“git rebase master”。反过来可能会导致不良的副作用。

然后你检查 master 并合并来自实验分支的更改。你的历史应该保持线性。

于 2009-07-15T06:20:19.053 回答
4

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

git checkout master
git merge --squash featureZ

它会将分支上的所有提交压缩为主分支上的单个提交。您将有机会编辑日志消息,该消息以在分支上完成的操作摘要进行初始化。

它的缺点是没有记录功能分支上的单个提交。此外,您应该只执行一次,不要在分支上再做任何工作,因为它没有注册为正确的合并,任何后续合并都可能产生不希望的结果。

于 2009-07-15T07:48:15.413 回答
2

fake-code-monkey-rashid 给出的答案是正确的。这不是一个答案,而是一个简化。

您可以从任何 git 分支 svn rebase/dcommit。master的唯一用途是,如果您有其他本地更改需要与featureZ的更改合并。

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

于 2009-07-20T22:37:18.693 回答
0

您可以使用SubGit代替 git-svn 。它是一个服务器端工具,可以自动同步 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. 在主干/主干之上重新设置功能分支。

    git rebase featureZ
    git push
    
  3. 来自功能分支的 Squash 提交。

    git merge --squash featureZ
    git commit
    git push
    

一旦您推送更改,SubGit 挂钩就会将您的更改转换为 Subversion 修订。

更多细节:

  • SubGit 在许多方面都比 git-svn 更优越——更好的合并跟踪翻译、EOL 和 mime 类型支持等。
  • SubGit 需要本地访问 Subversion 存储库(它使用自定义挂钩);
  • SubGit 是一个商业产品,有一些免费选项(开源和学术项目、小团队)。
于 2012-06-18T15:01:44.213 回答