SVN向上移动一级

时间:2014-12-26 11:38:57

标签: svn

我有这样的项目

project_dir
└── htdocs

SVN checkout在htdocs dir上执行,所以这是root目录,我有这个svn信息

工作副本根路径:/ home / user / project_dir / htdocs 网址:svn://mydomain.com/something

现在我想将SVN root从htdocs更改为一级,所以我以root身份登录到project_dir,而不是htdocs。

是否有一些简单的方法可以做到这一点,并保持htdocs中的所有文件完整(我有一些被忽略和非版本化的文件......)?

我试图在htdocs目录中执行它:

svn switch --relocate svn://mydomain.com/something svn://mydomain.com/something/htdocs

但是这个错误无效

svn: E195009: 'svn://mydomain.com/something/htdocs' is not the root of the repository

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我认为你不需要relocate。您需要结帐svn://mydomain.com/something,并且无法重新定位或切换svn://mydomain.com/something/htdocs结帐。

您可以做的是结帐svn://mydomain.com/something,删除其中的htdocs目录,然后移动现有目录。你只需稍微移动目录,但它应该工作。例如:

cd /home/user
mv project_dir project_dir.bak
svn co svn://mydomain.com/something project_dir
rm -fr project_dir/htdocs
mv project_dir.bak/htdocs project_dir/
svn st project_dir

如果不能选择移动目录,这是另一种方式:

cd /home/user
svn co svn://mydomain.com/something something_new
mv something_new/.svn .
svn revert -R .

答案 1 :(得分:1)

您是在谈论重构存储库结构还是工作副本?

尽管可能,但我对重建存储库非常犹豫。但是,从您的一些陈述中,您可能希望重新构建工作目录。在Subversion 1.6及更低版本的版本中,这很简单,因为工作目录树中的每个目录都有一个完整的.svn目录级别的目录。砍掉 root 不会导致任何问题。

但是,在Subversion 1.7中,工作目录的布局已更改。根目录中只有一个.svn目录,而且它是整个工作目录的目录。关掉根将会打破你的工作副本。

但是,那么你要解决的问题是什么?如果您只在htdocs子目录树中进行更改,则可以在该级别提交。当你进行提交时,你工作目录树的样子并没有什么区别。提交历史将是相同的。

如果问题是磁盘空间,请使用--set-depth从工作目录中删除所有其他项目。或者,咬紧牙关,并对htdoc的目录进行新的检查:

$ svn co svn://mydomain.com/something/htdocs

移动服务器本身时使用relocate命令。例如,我最近重新配置了我的Apache httpd服务器以从此处移动我的存储库URL:

http://svn.server.com/svn/CorporateServerTRD/trunk/...

http://svn.server.com/trd/trunk/...

svn relocate进入图片的地方。这样,您可以将您的仓库移动到其他服务器,或从http://切换到svn://,反之亦然,用户不必重做结帐。 svn relocate命令很快,因为只有一小部分信息必须更改。

还有另一个命令svn switch(在早期版本中也是 relocate 命令)将您的工作副本从一个URL切换到另一个URL:

$ svn co svn://mydomain.com/something/trunk/htdocs

哎呀...我应该在3.2分支上完成我的工作:

$ svn switch svn://mydomain.com/something/branches/3.2/htdocs

你可以在你的工作目录上试试,但它肯定不会比新的结账更快。

如果您确实想要重构您的存储库,那么创建一个工作目录可能是最简单的:

# First, checkout the repository root with the first level of directories in it

$ svn co --set-depth=immediates $REPO_ROOT

# Now let's get all of the directories and files immediately under htdocs
$ svn up --set-depth=immediates htdocs

# You now want to remove everything from the root of your repo execept
# for the htdocs directory. If you're using BASH, you can do the following.
# If your on Windows, you may have to do the delete one at a time.
# shopt -s extglob
$ svn delete !(htdocs)

# Now move all the files and directories in the current `htdocs` to the
# root of the repository
$ svn mv htdocs/* ..

# Delete the now empty htdocs directory
$ svn delete htdocs

# Commit your changes
$ svn commit -m"Make 'htdocs' my new root."

现在,您的htdocs内容将成为存储库的根目录。但是,您的提交历史记录将更难以遵循,合并或还原将更加困难。这就是为什么你没有充分理由盲目地移动和重组你的存储库的原因。

什么是好理由?如果您在没有它们的情况下设置您的仓库,可以在trunkbranchestags目录中添加。也许如果你的行李箱变得如此混乱,以至于你已经放弃它并且它的历史现在毫无意义。即使在那里,我也会犹豫不决。我宁愿合并回到一个好的主干而不是删除并将分支移动到那个地方。