我有一个包含这样的主目录的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
孩子的兄弟姐妹(例如蔬菜)。
答案 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命令一样快。