git或svn Responsitory有两个不同的代码“视图”,一个隐藏了某些目录

时间:2013-08-18 22:11:38

标签: git svn

我想维护一个存储库的两个不同的“视图”,一个显示整个代码的访问控制,另一个删除一些目录的公共。

这可能与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

2 个答案:

答案 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 applygit am将它们放入私人仓库中(克隆)...然后通过执行相同的操作重新生成公共仓库在之前:相同的git clone --barecd - 进入克隆,git filter-branch等。(您需要花费大量时间来设置和测试{{ 1}}发布第一个filter-branch之前的参数,所以整个事情应该放在脚本中。)

这个工作的原因(好吧,我认为它有效,请注意我还没有测试过)是当public.git对全新的filter-branch进行更改时,它会使< em>相同上次更改,从相同的原件开始,导致与以前一样的逐位相同的副本,因此提交将具有与之前相同的SHA-1值上次你做了new_public.git。只有添加到“顶部”的任何新提交都会有所不同,这是正常的,因为它们是使用git filter-branch的任何人的新的,顶部的,快进式提交。

效率不高,因为它每次都重做同样(非常繁重)的工作。 (为了提高效率,不要将差异仅应用于私有仓库,而是将它们应用于私有仓库和公共仓库。通过编写保存某个地方的脚本 - 私有仓库状态来自动执行此操作,计算所有必需的补丁,并应用所有这些公共仓库的补丁然后更新保存的私有仓库状态。但是如果你不同步并且不得不重做整个过滤器分支的东西,那么公共仓库的用户可能会受到冲击,因为这会带来很多机会。小差异,例如,在提交时间戳中。)