0

这对我来说是一件很新鲜的事情。我们已经允许我们的客户访问我们的源代码。使用 bitbucket/Sourcetree 我打算使用 Fork 授予他对给定状态/提交的读取访问权限。我不想授予对实际(仍在开发代码中)的访问权限。我计划只分享里程碑。可以以这种方式使用 Forks 吗?是否有其他选项可以仅共享特定提交?BR,丹尼尔

4

2 回答 2

0

对于我认为您想要做的事情,最简单的方法是:

  1. 您要分享的结帐提交;
  2. 以其他名称复制.git项目目录(不包括隐藏目录);
  3. 将该复制的项目目录导入为新的 git repo(在 github、bitbucket 或任何地方)。或将其压缩并直接发送给客户端。

这样,客户将看到您的代码的快照。没有当前的提交,也没有历史。

于 2017-04-05T16:53:47.973 回答
0

我不相信有办法在 repo 中提供提交或分支级别的访问控制。创建一个更有限的 repo 是一种合理的方法,但根据您的需要,我可能会建议一些替代方法,以按照 Sergio Tulentsev 建议的方式复制快照。

这样做的潜在缺点是丢失任何可以在内部将共享快照连接回您的历史记录的数据。如果您将来可能会提供新版本,或者您可能会接受来自分叉的补丁回到您的代码库中,那么这种分离会产生额外的工作。

解决方案的一部分是简单地跟踪您的提交(带有历史记录)和它们的提交(提供的快照)之间的关系;而这部分问题你可以通过某种标记约定来解决。但除此之外,如果您认为您可能想要来回迁移更改,那么您可以进行设置以避免一些手动迁移工作。

所以你可以尝试这样的事情:

首先,在您的 repo 中,确定您最初想要共享的提交并为 fork 创建一个分支。如果您将提交标记为 commit-to-be-shared 然后

git checkout commit-to-be-shared
git checkout -b fork_master

(或者可能是客户的名字而不是fork-master,如果您认为这是您可能会再次为其他人做的事情......)

接下来,不要手动复制到新的存储库,而是对您的源进行“浅克隆”。请注意,您必须使用 URL(不是本地路径);因此,如果您通常将 repo 处理为/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是本质上重复的“客户安全”提交A,并且F2是新合并。然后客户会看到

F1 ---- F2
       /
      B

您可能必须在调用create--allow-empty时使用该选项。git commitB

注意我没有机会测试这个端到端;如果您在任何步骤中遇到错误,请告诉我,以便我进行相应更新。

于 2017-04-05T17:34:28.323 回答