如何在SVN中分支一个修改过的工作副本?

19

我开始处理对trunk的一个小修改,一个月后回来发现这实际上是一个充满错误的完整的副项目,并且需要自己的branch。此外,一旦我分支了这些更改,我想将我的工作副本重置为当前在trunk中的内容,以便在回到这个副项目之前,我可以帮助主要的开发工作和高优先级的事项。

所以:

  1. 我想基于我的工作副本创建一个新的分支,而不必检入我的工作副本(它与最新的HEAD修订版保持同步)

  2. 一旦我已经派生了我的工作副本,我想基本上删除所有在分支中的更改,并将其设置为与trunk中的当前HEAD修订版本相匹配。

该怎么做?我正在使用TortoiseSVN,但即使是命令行指令也将非常有用。


这里有一个类似的问题:https://dev59.com/HHM_5IYBdhLWcg3wmkYK - Ashley
3个回答

13

所以我尝试了两种方法在没有提交的情况下将我的工作副本分支化,不确定哪种方法最好:

方法1:复制整个目录到新分支

  • 右键单击您的工作副本文件夹,选择Tortoise SVN>Repo Browser
  • 在Repo Browser中创建一个名为“branches”的新目录,与“trunk”处于同一级别
  • 在“branches”目录内,创建一个具有您所谓的“名称”(即标识此分支的标签,例如:如果您正在此分支中开发特殊通知系统,则称其为“notifications”等)的新目录。
  • 现在,在Repo Browser中仍然右键单击并选择“Add Folder”,然后选择您的本地工作副本
  • 这将需要一段时间,因为所有文件(包括.svn文件)都被复制。这也会复制未版本化的文件和您已经svn:ignored的文件,可能不是您想要的。

方法2:使用Branch/tag

  • 右键单击您的工作副本文件夹,选择Tortoise SVN>Branch/tag...
  • 它会打开Repo Browser,因此创建一个名为“branches”的新目录,然后在其中创建一个具有您分支“名称”的新目录
  • 在“从以下位置创建副本”部分中选择“Working Copy”按钮。这是将本地更改的差异提交到此分支的方法
  • 这似乎仅复制与HEAD修订版本不同的文件。
  • 但是,如果您再次使用Repo Browser查看其中包含的内容,则完整的HEAD修订版本+您的本地更改都在其中

看起来方法2绝对更可取。

然后,为了清除,只需Tortoise SVN>还原...并“删除所有未版本化”即可。


方法二对我非常有效 - 在'17中UI有点不同,但是指示让我通过了。 - Conrad
方法二对我也起作用了。好主意。 - BoiseBaked
你说“有两种方法可以在不检入工作副本的情况下进行分支”,但是方法1难道不是确实要检入工作副本吗? - Mauro Molinari

4
如果您希望继续在同一个文件夹中工作,可以参考这篇文章
基本上,使用 svn copy 创建分支,使用 svn switch 从同一工作副本指向新分支,最后使用 svn commit 提交您的更改。
请确保从您开始修改的同一分支/版本创建分支(使用 svn info 进行检查),否则您可能会在切换后遇到许多冲突。

2
也许你可以在回答中总结那篇帖子 - 否则,如果该链接失效,你的回答将对未来有兴趣解决问题的人毫无用处。 - Tom Auger

3
在命令行中,您可以使用Subversion的“diff”命令创建补丁,然后使用Subversion的“patch”命令将其应用到新分支上。 (您可以通过执行“svn help diff”和“svn help patch”来了解这些命令)。 假设您有主干和一个名为new_branch的分支在同一父目录中。
cd trunk
svn diff > ..\my_stuff.diff

现在你已经有了补丁,那么将其应用到你新创建的分支上。
cd new_branch
svn patch ..\my_stuff.diff 

您可以在打补丁命令中添加--dry-run标志来先试运行补丁,以查看是否有任何奇怪的情况发生,然后再实际应用补丁。

svn patch ..\my_stuff.diff --dry-run

很酷。但是听起来你正在从主干存储库创建差异文件,而不是工作副本?还是我理解有误? - Tom Auger
不要使用svn diff命令“显示工作副本中的本地修改”:http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.diff.html,这样我就可以获取我的本地更改。 - crunchdog
1
我对你的解决方案很感兴趣。看起来你正在修补new_branch,使它变得像工作副本一样。那么你首先如何获得new_branch呢? - Tom Auger

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