svn移动目录以重新组织仓库

时间:2011-10-05 19:06:28

标签: svn

我有一个包含这样的主目录的svn repo:

/apples/
/bananas/
/pears/

在我的工作副本中,这些实际上是更大树的子目录......

/food/fruit/apples
/food/fruit/bananas
/food/fruit/pears
/food/veggies/asparagus
/food/veggies/broccoli

我想重新组织我的回购,以便/ food /实际上是回购的根源......但是我的工作副本是一个实时服务器,所以我需要非常小心不要打破任何东西,甚至一分钟。它也是一棵非常大的树,所以回滚错误可能会造成明显的停机时间。

如果这只是在回购中移动文件夹,我想我知道如何使用svn move和repo参数(我认为这仍然是步骤#1?)...但我不是确定如何将更改应用于工作副本,然后添加父文件夹,而不是搞砸现有的工作文件。

我的回答:感谢A.H。

1)确保仓库是最新的,然后在仓库中移动分支。这可以使用repo本身上的svn move命令或通过工作副本上的操作来完成。这不会影响实时工作副本(不要svn update!)。这很容易。

2)svn switch分支到新位置。在这个例子中,虽然水果以前是回购的根源:

svn switch https://host/svn/fruit /food/fruit

我以前对svn switch的了解不多,但这并不太棘手。这会更改所有.svn元数据,但不会影响实际文件。

3)这是棘手的部分。您需要快速连续执行这些步骤以最大限度地减少停机时间(它们都非常快):

mv /food/fruit /food/fruit-temp
svn co --depth immediates https://host/svn/ /food/
rm -rf /food/fruit
mv /food/fruit-temp /food/fruit
svn update --set-depth infinity /food/

这里发生的事情是,--depth immediates的结帐会为/ food /的内容创建元数据,并创建/ fruit / subdir 但不创建其内容(我们需要使用{ {1}}所以我们可以摆脱水果中的.svn文件夹,但那就是那里的一切。然后我们只是重新交换真实内容,现在将父母和孩子拼接在一起。 rm -rf完成后,我们将重新上线。 mv将工作副本的范围扩展到您期望的范围。最后,我们可以set-depth infinity孩子的兄弟姐妹(例如蔬菜)。

2 个答案:

答案 0 :(得分:10)

我的第一个提示是从一个不活的新工作副本开始。在该工作副本(WC)中,您可以毫无危险地尝试。这就是工作复制的真正含义; - )

另一个提示:使用第二个工作副本将现有结构逐步重新排列到所需的结构中。完成所有操作后,请检查。请注意,必须使用svn命令完成重新安排。

然后使用另一个工作副本来检查,您的上次签入确实是您缩进的内容。

然后,您可以使用普通的mv命令更新您的实时工作副本或使用现场网站持续使用WC的简单开关。

一步一步:

svn co $URL new-wc
cd new-wc
svn mkdir food
svn mkdir food/fruit
svn mv apples food/fruit
svn mv bananas food/fruit
svn mv pears food/fruit
svn ci

现在检查一个新的WC验证 - 现场WC仍然没有改变!

cd ..
svn co $URL verify-wc
# take time and verify

现在在文件系统中切换实时WC和验证WC - 如果它们位于同一个文件系统上,则速度很快!

mv live-wc live-wc-old
mv verify-wc/food/fruit live-wc

现在直播WC是固定的。 ast块的替代方案可以是:

cd live-wc
svn switch $URL/food/fruit

这不应该耗费任何时间 - 但请先用备份副本检查: - )

答案 1 :(得分:0)

我会构建一个替换,然后在你的实时工作副本上使用svn开关切换到它。

1)svn将整个工作目录复制到新的工作目录

2)在新工作副本中创建父文件夹

3)svn将文件从副本中的当前相对位置复制或移动到预期位置。

4)如果您对新工作副本的设置非常满意,请提交

5)现在,在您的实时版本中,使用svn开关重新定位到新的工作目录

随着SVN删除现有文件并检出新文件,您的服务器将暂时遭受重组。但它会像svn switch命令一样快。