在Subversion中与团队成员进行有效的微观合作?

时间:2009-02-21 06:40:59

标签: svn

有时我正在研究一个功能并遇到一个奇怪的崩溃或其他我无法立即解决的问题。然后我想把我当前的源代码提供给我旁边的人,这样他也可以尝试解决它。​​

好像我有3个坏选项和0个好选项?

  • 将其提交到trunk,以便他可以获取我的更改。 不!代码未完成
  • 创建一个workbranch并在那里提交。当我正在处理一个小功能时,不值得麻烦。
  • 做一个svn diff,通过ssh向他发送补丁并让他应用它。仍然不值得麻烦

在Subversion中处理此问题的标准方法是什么?

另外:像git这样的DVCS工具会比Subversion更好地处理这个看似简单的情况吗?

4 个答案:

答案 0 :(得分:1)

我过去使用send-a-patch方法完成了这项工作。但是,以后很难协调这些更改。

我现在使用Git,它肯定有助于这种情况,这是一件非常自然的事情。我可以从我的存储库中获取特定的提交并帮助处理它们。我们每个人都可以提交,然后我可以从他们的存储库中提取提交,使用git rebase -i来组织所有内容,然后从那里开始。

答案 1 :(得分:1)

subversion的问题(我说这是它的日常用户)是它没有提出早期和经常检查源代码控制的想法。由于集中式分支机构,通常没有人检查,直到代码“准备好”(空中报价)。在与小团队合作之前,我在Subversion中创建了每用户分支。所以你的回购可能会如下所示分解

/
`---> trunk/
`---> branches/
`---> users/
            `---> john/
                      `---> trunk/
                      `---> branches/
            `---> mary/
                      `---> trunk/
                      `---> branches/

对于颠覆而言,它可能会开始变得有点混乱,我不确定它对于大型团队来说有多么有效。 SVNmerge可以帮助解决一些问题,但它可能是一种可能的解决方案。 git(一般来说,大多数DCVS')可以消除大部分这些问题,这是它们受欢迎的原因之一。

答案 2 :(得分:0)

我通常会将违规代码的电子邮件(或以其他方式转移)的权宜之计转交给我的同事,假设他/她没有对该单位(或那些单位)进行无法暂时更改撇在一边。然后他/她将我的更改复制到位并开始工作。没有比这更多或更少。后来,当他们做差异时,他们看到我的差异变化,从存储库更新以覆盖他们帮助的代码,并且瞧。一切都恢复正常。

答案 3 :(得分:0)

如果对方真的坐在你旁边,我可以建议配对编程吗?他们可以来到您的计算机,您可以一起工作。它可以非常有效,当你遇到麻烦时,你不必孤立地工作。

话虽如此,即使使用结对编程,有时您也必须将代码发送给尚未准备好进行中继的其他人。除了涉及的输入外,在subversion中创建一个短命的分支并不多,而一些小脚本会为你自动完成很多过程。

这是两个适合我的脚本。他们假设一个存储库结构,如:

project/trunk/
       /branches/some_branch
                /another_branch

使用其他结构需要进行一些调整。

# script 1: svn_wc2b (working copy to branch)
trunk_url=`svn info | grep URL | sed 's/URL: //'`
project_base=`svn info | grep URL | sed 's/URL: //;s/\/trunk.*//'`
branch_name=my_working_copy

svn cp $trunk_url $project_base/branches/$branch_name -m "Creating temporary branch for working copy."
svn switch $project_base/branches/$branch_name

然后,当您想要共享主干的工作副本时,您可以输入:

svn_wc2b  # creates branch, switches to it    
svn commit # commit your in-progress work to the branch

要获取代码,其他开发人员只需输入:

svn switch http://repository/project/branches/my_working_copy

当其他开发人员完成并且已提交更改时,请使用如下脚本:

# script 2: svn_b2wc (branch to working copy)
branch_revision=`svn log -q --stop-on-copy | grep '^r[0-9]' | sed 's/^r//;s/ |.*//' | tail -n 1`

if [ -e $branch_revision ] && [ -e $1 ]
then
  echo "Couldn't get branch creation revision number. Check svn log --stop-on-copy and use svn_b2wc <revision_number>"
  exit
elif [ -e $branch_revision ]
then
  branch_revision=$1
fi

branch_url=`svn info | grep URL | sed 's/URL: //'`
project_base=`svn info | grep URL | sed 's/URL: //;s/\/branches.*//'`
branch_name=my_working_copy

svn switch $project_base/trunk
svn merge -r $branch_revision:HEAD $branch_url .
svn delete $branch_url -m "Deleting working copy branch."

从已切换到分支的目录中键入:

svn_b2wc # switch back to trunk, merge branch changes, delete branch

分支中更改的代码现在又回到了trunk的工作副本中,您可以继续工作直到准备好提交。分享一些代码可能看起来很多,但是如果你花一些时间用脚本自动化你的流程,那么每次你需要使用它时只需几秒钟。