不是很漂亮而且效率极低,但可以完成工作:拥有一个私有 git 存储库,有权访问的人可以克隆、获取和选择性地推送到。用它来克隆一个 repo,申请git filter-branch
删除东西,并将其发布为普遍可访问的。
对于(未经测试的)示例,假设需要 ssh 访问并且通常是“私有的”并且包含不应该公开的--bare
repo :some.host
secret.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 apply
orgit am
将它们放入(克隆)私有仓库......然后通过做与以前相同的事情重新生成公共仓库:same ,-into-clone ,等等。(你会想要花费在发布第一个参数之前需要花费大量时间来设置和测试参数,所以无论如何整个事情都应该放在一个脚本中。)git clone --bare
cd
git filter-branch
filter-branch
public.git
这个工作的原因(嗯,我认为它工作,请注意我没有测试过)是当filter-branch
对 all-new 进行更改时new_public.git
,它会进行与上次相同的更改,从相同的原件开始,导致与以前的逐位相同副本,因此提交将具有与您上次执行git filter-branch
. 只有“在顶部”添加的任何新提交会有所不同,这没关系,因为对于使用public.git
.
它效率不高,因为它每次都重做相同的(相当繁重的)工作。(为了提高效率,不要将差异仅应用于私有仓库,而是将它们应用于私有和公共仓库。通过编写一个脚本来自动执行此操作,该脚本在某处保存私有仓库状态,计算所有必需的补丁,并应用所有这些给公共仓库打补丁,然后更新保存的私有仓库状态。但是如果你不同步并且不得不重做整个过滤器分支的事情,公共仓库的用户可能会被淹没,因为这会带来很多机会小的差异,例如,提交时间戳。)