创建另一个SVN存储库中源文件的外部SVN存储库

时间:2012-05-09 21:34:41

标签: svn version-control tortoisesvn

我有原始 subversion repo的工作副本。我想对工作副本中的某些文件进行实验性更改,而无需在原始存储库中进行分支,标记等操作。

目标

  • 可以随时轻松回到原始
  • 无意将更改合并回原始 repo trunk。
  • 捕获许多离散的“实验”,根据需要捕获尽可能少的代码
  • 并将其全部保留在原始回购。
  • 之外
  • 不需要与特定原始回购版本同步。
  • 我希望能够从原始 repo的工作副本开始,并将特定文件夹和/或文件定位到 experimental repo。

细节是魔鬼

我知道external属性。我认为这是关键,但我必须滥用乌龟界面,因为我无法解决问题。

  • 原始 repo ...
  • 的工作副本开始
  • 我创建了 experimental repo&最小文件夹结构
  • “检查(编辑)”到我要试验的文件夹。
  • 在目标文件夹上单击鼠标右键。此时乌龟挂起然后中止。
  • 在目标文件夹上单击R / click属性,使用本地路径和URL创建external属性。
  • 目标文件夹上的R-click / Update ...导致乌龟挂起然后中止。
  • 尝试将该文件夹“导出”到原始
  • 中取消版本
  • 注意:我没有管理员级别访问原始回购。

请不要

  • 建议我研究Stack Overflow
  • 建议我使用代码库的完整副本创建 experimental repo。

1 个答案:

答案 0 :(得分:2)

让我们来看看你想要什么。我打算对它们进行编号,以便我以后可以参考它们......

  1. 能够随意指回原文。
  2. 无意将更改合并回原始的repo trunk。
  3. 捕获许多离散的“实验”,根据需要捕获尽可能少的代码 并将其全部保留在原始仓库之外。
  4. 不需要与特定原始回购版本同步。
  5. 我希望能够从原始仓库的工作副本开始,并将特定文件夹和/或文件作为目标进入实验仓库。
  6. 根据#2,您永远不会将此代码合并到原始代码中。没关系。你可以拥有分支,永远不会对它们做任何事情。根据Point#4,您甚至不想同步回原始回购。一旦进行了更改,您就不会想要回购中的新内容。

    第1点和第3点让我感到困惑。您是什么意思能够随时轻松回到原始?您是否意味着必要时应将原始回购的更改放入您的内容中?并且,您对许多离散实验的意义是什么?你是说你想尝试原始变化的不同方向吗?

    什么阻止您查看基本代码,只是创建自己的私有存储库?

    您可以使用分支进行许多离散实验,只需在原始代码库中反复分支即可通过创建标记进行标记。只需返回标签,您就可以随时返回原来的

    那会有用吗?

    $ # First create the experimental repo
    $ cd $HOME/my_repo
    $ svnadmin create my_repo
    $ # Now let's start it up
    $ svnserve -r . -d
    $ # Now, let's do a checkout and get some work done!
    $ mkdir $HOME/my_workspace
    $ cd $HOME/my_workspace
    $ svn co svn://localhost my_project
    $ cd my_project
    $ # This is an empty directory. Let's fill it up!
    $ svn mkdir trunk tags, branches
    $ cd truck
    $ # Now, get the revision you want and put it in your repository
    $ svn export http://server.com/src/trunk/project .
    $ # We have all of the code, let's add it to our repository
    $ svn add *
    $ cd ..
    $ svn commit -m"Original code"   #This is  your original
    $ # Now, we'll mark the original, so you can get back to it
    $ svn cp -m"Tagging original" svn://localhost/trunk svn://localhost/tags/ORIGINAL
    

    现在,您拥有自己的存储库,因此您的更改不会显示在原始存储库中。而且,您可以通过查找ORIGINAL标记返回原始来源。

    让我们做三个实验

    $ svn cp -m"Experiment #1" svn://localhost/tags/ORIGINAL svn://localhost/branches/experiment_1
    $ svn cp -m"Experiment #2" svn://localhost/tags/ORIGINAL svn://localhost/branches/experiment_2
    $ svn cp -m"Experiment #3" svn://localhost/tags/ORIGINAL svn://localhost/branches/experiment_3
    

    请注意我是如何从ORIGINAL标记中分支出来的?这样,我知道我回到原来的代码。请注意,分支用于每个实验。我可能永远不会在它们之间合并,但那没关系。没有什么说你必须从一个分支合并到下一个分支。

    并且,您可以在完成实验后随时删除分支:

    $ svn delete svn://localhost/branches/experiment_1
    

    这仍然在存储库中,但在HEAD上执行svn ls时,您将不会再看到它。但是,如果需要,它仍然可以访问。它会使分支混乱,但如果你再次需要它,它仍然可用。

    所以,不要担心外部因素,只需创建一个新的存储库,导入代码,并享受乐趣。

    然而,当有人想在我的系统上做这样的事情时,我通常会劝阻它,并给他们一个他们可以在原始存储库上玩的分支。例如,我可能会给bob一个名为/branches/BOB/trunkbranches/BOB/branches branches/BOB/tags的目录。通过这种方式,标志着这是Bob的私人区域,他可以随心所欲地做任何他想做的事情。与此同时,Bob可以从repo中反复获取代码,甚至可以捕获更新的代码。如果很多人想要这样做,我会在初始层次结构中添加一个私人文件夹:

    /trunk
    /branches
    /tags
    /private
    

    并在/ private下为每个用户提供自己的目录。我有一个预提交钩子,可以防止用户触摸其他用户的代码。通过将所有内容保存在存储库中,我们可以提用户可以共享代码,进行不同的修订,并进行游戏。我从来没有在主存储库中保存私有实验的问题。