我想维护一个存储库的两个不同的“视图”,一个显示整个代码的访问控制,另一个删除一些目录的公共。
这可能与git或svn有关吗?也许通过使用某种形式的镜像脚本?
我想在两个存储库中维护相同的版本,并允许公共存储库的用户提交补丁。
提前致谢。我觉得这很奇怪!
编辑以获取更多信息:
我开发了一个非常大且相当复杂的开源应用程序。我们的用户目前直接从svn更新,它比tarball更适合我们的目的。
我们有一个可公开访问的svn存储库,它允许我们快速部署针对小错误的修复程序,并让每个人都能够使用单个命令下载它们,我们还有一个用于维护数据库架构的系统。基本上,我们不想放弃这个系统。
我们有一些功能只适用于商业许可证持有者(不管怎么说,必须支付纸板箱和拉面的费用,对吧?)。我基本上喜欢将'master'存储库移动到需要身份验证,并使公共存储库成为该存储库的镜像,并删除了非自由代码。
例如,经过身份验证的用户会看到:
html/index.php
html/includes/functions.php
html/includes/non-free/functions.php
但公众用户会看到:
html/index.php
html/includes/functions.php
我真的,真的不想尝试单独维护两棵树,这可能会导致代码的免费版本滞后很多,并且会让我们很难为免费版本的人修复bug
答案 0 :(得分:3)
不确定Git,但您可以在Subversion中使用path-based authorization。
这样的事情应该有效:
[yourRepo:/]
commercial = r
public = r
[yourRepo:/html/includes/non-free/]
public =
答案 1 :(得分:2)
不漂亮且非常低效,但是可以完成工作:拥有一个私有的git repo,那些具有访问权限的人可以克隆,获取和可选地推送。使用它来克隆存储库,应用git filter-branch
删除内容,并将其发布为通常可访问的内容。
对于(未经测试的)示例,假设--bare
上的some.host
回购需要ssh访问,并且通常是“私有”并且包含不应公开的secret.txt
:< / p>
$ git clone --bare ssh://some.host/path/to/private.git new_public.git
$ cd new_public.git # don't let the public see this yet!
$ git filter-branch --index-filter 'git rm --cached \
--ignore-unmatch secret.txt' -- --all # add --tag-name-filter etc if needed
$ rm -rf refs/original # and do pruning, etc; see man page
# note (as per man page) that you can clone this again instead, might be easier
$ cd ..
$ mv new_public.git /path/to/public.git # now it's safe; publish it
公共回购中的提交将与私人回购中的提交不同,但您仍然可以对公共回购进行任何修补。使用git apply
或git am
将它们放入私人仓库中(克隆)...然后通过执行相同的操作重新生成公共仓库在之前:相同的git clone --bare
,cd
- 进入克隆,git filter-branch
等。(您需要花费大量时间来设置和测试{{ 1}}发布第一个filter-branch
之前的参数,所以整个事情应该放在脚本中。)
这个工作的原因(好吧,我认为它有效,请注意我还没有测试过)是当public.git
对全新的filter-branch
进行更改时,它会使< em>相同上次更改,从相同的原件开始,导致与以前一样的逐位相同的副本,因此提交将具有与之前相同的SHA-1值上次你做了new_public.git
。只有添加到“顶部”的任何新提交都会有所不同,这是正常的,因为它们是使用git filter-branch
的任何人的新的,顶部的,快进式提交。
效率不高,因为它每次都重做同样(非常繁重)的工作。 (为了提高效率,不要将差异仅应用于私有仓库,而是将它们应用于私有仓库和公共仓库。通过编写保存某个地方的脚本 - 私有仓库状态来自动执行此操作,计算所有必需的补丁,并应用所有这些公共仓库的补丁然后更新保存的私有仓库状态。但是如果你不同步并且不得不重做整个过滤器分支的东西,那么公共仓库的用户可能会受到冲击,因为这会带来很多机会。小差异,例如,在提交时间戳中。)