答案 0 :(得分:0)
对于我认为你想做的事情,最简单的方法就是:
character set
隐藏目录除外); 这样,客户端就会看到代码的快照。没有当前提交也没有历史记录。
答案 1 :(得分:0)
我不相信有一种方法可以在回购中提供提交或分支级访问控制。创建一个更有限的回购是一种合理的方法,但根据您的需要,我可能会提出一些替代方法,以Sergio Tulentsev建议的方式复制快照。
潜在的缺点是丢失了将共享快照内部连接回历史记录的任何数据。如果您将来可能提供新版本,或者您可能接受从fork到代码库的补丁,那么这种分离会产生额外的工作。
部分解决方案只是跟踪您的提交(与历史记录)和他们的提交(提供的快照)之间的关系;并且您可以使用某种标记约定解决问题的这一部分。但除此之外,如果您认为可能需要来回迁移更改,那么您可以进行设置以避免一些手动迁移工作。
所以你可以尝试这样的事情:
首先,在您的仓库中,确定您最初要共享的提交并为fork创建一个分支。如果您将提交标记为将要共享的提交,则
git checkout commit-to-be-shared
git checkout -b fork_master
(或者也许是客户的名字,而不是fork-master
,如果你认为这是你可能会再为别人做的事情......)
接下来,不要手动复制到新的仓库,而是制作原产地的“浅层克隆”。请注意,您必须使用URL(不是本地路径);所以,如果您通常以/path/to/my/repo
的方式处理仓库,请使用类似file://path/to/my/repo
的内容......详细信息取决于您的操作系统,但希望您能看到我的意思......
cd ..
git clone --depth=1 -b fork-master http://my.server/origin-repo
这将只复制一次提交,并将fetch设置为仅检索fork-master
分支。 但是,它将保留提交的身份。因此,在您的来源中,将来您可以将更多更改合并到fork-master
中,并轻松共享生成的提交。 但是如果/当您推进更多更改时,请参阅下面有关避免意外历史曝光的说明。
接下来,您在服务器上(在您的原点旁边)准备一个空仓库,作为客户的来源。然后将其设置为新创建的浅层仓库中的第二个远程:
git remote add fork-origin http://my.server/fork-origin-repo
git push -u fork-origin master
(如果你认为以后可能会有更多的话,你可以再次使用客户特定的名称...)
如果您想允许,您的任何开发人员都可以添加fork-master
,这样您就可以无缝地接收来自客户的补丁。
有一个技巧可以确保您不会在将来无意中暴露历史。当您将来合并到fork-master
并将其传递给fork-origin
时,默认情况下会带来新合并提交的历史记录。明显简单的解决方案是,在您的浅层回购中:
git pull --depth=1
这里的问题是git会变得混乱。 (简短的解释是,新推出的合并意味着第二个父级的深度为1,而第一个父级则没有,而git似乎没有按照您希望的方式处理。)不难解决:
git pull --depth=2
现在你会看到,合并从新合并的工作中带来了一次额外的历史提交。该提交只包含您要合并到fork-master
的更改,因此它可能没问题;但也许该提交有一个提交消息,或标签,或者您不一定要分享的其他内容。在这种情况下,您可以在合并之前始终创建一种“缓冲区提交”。
F1 -------- F2 <--(fork-master)
/ /
/ B
/ /
X ---- X --- A --- X <--(master)
其中F1
是原始共享快照,A
包含您决定分享的更多更改,B
是一个“客户安全”提交,基本上重复{{1} },A
是新的合并。然后客户会看到
F2
在致电F1 ---- F2
/
B
以创建--allow-empty
时,您可能必须使用git commit
选项。
注意我没有机会测试这种端到端的情况;如果您在任何步骤中遇到错误,请告诉我,以便我可以相应更新。