我在这里读了几个答案,谴责使用svn:externals.我确实看到它们如何被滥用,它确实让我们更加依赖Subversion,但我真的没有看到我们的团队很快就会离开它.
无论如何,这是我的困境.我们的解决方案引用了多个项目,这些项目位于存储库的各自部分.其中许多项目在多个解决方案之间共享,我们也不希望阻止共享我们的项目.我们还在我们的存储库(单元测试框架,库等)中检查了几个固定版本依赖项.
我想配置一些只使用外部的"工作空间"(就Subversion而言,它们只是空目录,或者可能只包含一个解决方案文件)来为我们的开发人员配置解决方案.单独检出大多数项目将不足以构建它们,但是检查它的工作区将足以构建它,因为它的所有依赖项都将随附它.有没有其他人实现过类似的解决方案,并且svn:externals是一个很好的方法来解决这个问题?如果我们走这条路,你对我有什么谨慎的话?
基本上结构看起来像这样(为了简洁省略了trunk/branches/tags):
/projects
/project1
/project2
/dependencies
/xUnit
/1.5
/1.4
/NHibernate
/2.1.0
/2.0.1
/workspaces
/project1
/project1 (external to ^/projects/project1)
/xUnit (external to ^/dependencies/xUnit/1.5)
/NHibernate (external to ^/dependencies/NHibernate/2.0.1)
/project2
/project2 (external to ^/projects/project2)
/xUnit (external to ^/dependencies/xUnit/1.4)
/NHibernate (external to ^/dependencies/NHibernate/2.1.0)
Run Code Online (Sandbox Code Playgroud) 我们在企业环境中有一个svn存储库结构,如下所示:
root
libs
shared_lib1
shared_lib2
private_lib
public_code
private_code
Run Code Online (Sandbox Code Playgroud)
其中public_code是一个外部存储库,它是开源的,公司外部的人员具有读写访问权限.shared_lib1和shared_lib2也是与另一家公司的不同程序员组共享的外部存储库.我是维护者,基本上可以做任何技术上最好的,外部用户必须适应.
我现在想知道从这个结构转移到mercurial存储库的最佳方法是什么.
1)我可以使用mercurial子存储库来密切模拟旧的设置.或者
2)我可以为我们制作一个大型仓库,为外部合作伙伴创建三个新的小型独立存储库(基本上是分支项目),并在大型和独立的交换机之间交换变更集.
使用svn中的setup 1),分支是一场噩梦,因为当我分支root时,策略总是必须分支public_code,shared_lib1和shared_lib2.为此,我必须调用svn分支四次并手动修改svn:externals属性三次.我可以轻松地将主仓库分支到mercurial并自动获取所有子仓库的新分支吗?
当我设置2)时,repos之间的文件系统会有所不同.例如,我将在repo"root"中使用public_code/Makefile,但该文件将只是repo"public_code"中的"Makefile".Mercurial仍然能够同步回购之间的变化吗?工作流程怎么样?
如果我没有碰到这个页面,我就不会知道svn:externals .所以,我设置了我的工作文件夹.然后
mkdir lib/vendor
svn add --parents lib/vendor
svn ps svn:externals 'symfony http://svn.symfony-project.com/branches/1.4/' lib/vendor/
svn ci -m "add externals"
svn update
Run Code Online (Sandbox Code Playgroud)
"svn update"列出了整个symfony文件夹并且非常慢.我以为这会是一次性的痛苦.但是,每次输入"svn up"时,SVN都会检查外部存储库.我必须使用--ignore-externals来使"svn update"足够快.
我想知道svn:externals有什么好处,如果它太慢了.我宁愿将symfony复制到我自己的存储库,这肯定是一个更快的解决方案.
因此,我对TCL编程的方式非常新,缺乏经验.我写了一个脚本,调用别人写的proc,首先删除输出文件.然后我做了一些我写的额外逻辑.
我将逻辑移动到第二个过程中,并立即将其中的一堆(即rm命令)打破.
据我所知,中央执行中的第一个程序(proc定义后面的文本)在没有"exec"命令的情况下正常执行.但是,如果你在proc中移动它,它现在需要一个"exec"命令.
任何人都可以向我解释为什么TCL这样做?
例如
proc helloworld {} {
puts "hi"
}
#works
rm my_file
helloworld
Run Code Online (Sandbox Code Playgroud)
..
proc helloworld {} {
#doesn't work
rm my_file
puts "hi"
}
helloworld
Run Code Online (Sandbox Code Playgroud)
..
proc helloworld {} {
#works
eval rm my_file
puts "hi"
}
helloworld
Run Code Online (Sandbox Code Playgroud)
..
proc helloworld {} {
#works
file delete my_file
puts "hi"
}
helloworld
Run Code Online (Sandbox Code Playgroud)
*请注意,这种奇怪的行为可能是特定于我将脚本提供给vmd的程序,后者具有自己内置的TCL行为.也许在您的回复中,您可以指出这是否也是其他口译员的标准?