0

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

这可能与 git 或 svn 吗?也许通过使用某种形式的镜像脚本?

我想在两个存储库中保持相同的修订,并允许公共存储库的用户提交补丁。

提前致谢。我觉得这很奇怪!

编辑以获取更多信息:

我开发了一个非常大且相当复杂的开源应用程序。我们的用户目前直接从 svn 更新,它比 tarball 更适合我们的目的。

我们有一个可公开访问的 svn 存储库,它允许我们快速部署修复小错误并让每个人都可以通过一个命令下载它们,我们也有一个维护数据库模式的系统。基本上,我们不想离开这个系统。

我们有一些功能仅适用于商业被许可人(必须以某种方式支付纸板箱和拉面,对吧?)。我基本上想移动“主”存储库以要求身份验证,并使公共存储库成为该存储库的镜像,并删除了非自由代码。

例如,经过身份验证的用户会看到:

html/index.php
html/includes/functions.php
html/includes/non-free/functions.php

但是公共用户会看到:

html/index.php
html/includes/functions.php

我真的真的不想尝试分别维护两棵树,这可能会导致免费版本的代码滞后很多,并且会使我们难以为免费版本的人们修复错误。

4

2 回答 2

3

不确定 Git,但您可以在 Subversion中使用基于路径的授权。

像这样的东西应该工作:

[yourRepo:/]
commercial = r
public = r

[yourRepo:/html/includes/non-free/]
public = 
于 2013-08-19T00:20:31.160 回答
2

不是很漂亮而且效率极低,但可以完成工作:拥有一个私有 git 存储库,有权访问的人可以克隆、获取和选择性地推送到。用它来克隆一个 repo,申请git filter-branch删除东西,并将其发布为普遍可访问的。

对于(未经测试的)示例,假设需要 ssh 访问并且通常是“私有的”并且包含不应该公开的--barerepo :some.hostsecret.txt

$ 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

公共 repo 中的提交与私有 repo 中的提交不同,但您仍然可以获取对公共 repo 所做的任何补丁。使用git applyorgit am将它们放入(克隆)私有仓库......然后通过做与以前相同的事情重新生成公共仓库:same ,-into-clone ,等等。(你会想要花费在发布第一个参数之前需要花费大量时间来设置和测试参数,所以无论如何整个事情都应该放在一个脚本中。)git clone --barecdgit filter-branchfilter-branchpublic.git

这个工作的原因(嗯,我认为它工作,请注意我没有测试过)是当filter-branch对 all-new 进行更改时new_public.git,它会进行与上次相同的更改,从相同的原件开始,导致与以前的逐位相同副本,因此提交将具有与您上次执行git filter-branch. 只有“在顶部”添加的任何新提交会有所不同,这没关系,因为对于使用public.git.

它效率不高,因为它每次都重做相同的(相当繁重的)工作。(为了提高效率,不要将差异仅应用于私有仓库,而是将它们应用于私有和公共仓库。通过编写一个脚本来自动执行此操作,该脚本在某处保存私有仓库状态,计算所有必需的补丁,并应用所有这些给公共仓库打补丁,然后更新保存的私有仓库状态。但是如果你不同步并且不得不重做整个过滤器分支的事情,公共仓库的用户可能会被淹没,因为这会带来很多机会小的差异,例如,提交时间戳。)

于 2013-08-18T23:52:14.457 回答