【问题标题】:Share git repo but with one directory “hidden”?共享 git repo 但一个目录“隐藏”?
【发布时间】:2014-07-18 18:10:00
【问题描述】:

情况是这样的:

我们在某个服务器上有一个 git repo,上面有一个分支,假设它是 master。我们将该 repo 克隆到我们自己的机器上并在其上执行操作。我们每个人都有自己的本地分支,但是当我们推送到服务器时,我们总是先将本地更改合并/rebase 到master,然后再推送到服务器。

一切都很好。

现在其他一些人想加入开发。因此,我们决定与他们共享我们的 repo,除了一个特定的目录。我们想要的是某种机制,我们可以像往常一样开发项目(服务器上的一个分支,为方便起见是本地分支),但是当“其他人”克隆项目时(可能使用其他一些克隆命令,或其他机制提供的正确命令,我们将教他们命令),他们可以看到除该特定目录之外的所有内容(或者他们可以看到目录,但它是空的,或者他们没有访问权限),他们还可以将他们的更改推送到服务器,并拥有自己的本地分支等。

实现这一目标的最佳方法是什么?我不介意在服务器上有多个存储库。

我一直在研究子模块,并做了一些测试。我不喜欢子模块的一点是我必须进入子模块目录并添加/提交/推送等(呃……对吗?)。此外,我不确定子模块如何适应我们的本地分支机构工作流程。欢迎提出任何建议。

【问题讨论】:

  • 为什么他们不能看到该目录或其内容?如果它包含访问令牌/敏感信息,则应使用存储库外部的环境变量
  • @jessh:因为该目录的作者不希望其他人(除了我们)看到他的代码。该目录是该项目的一部分,因此我们更愿意将其放在项目中并作为一个整体进行开发。

标签: git version-control git-submodules


【解决方案1】:

您可能需要查看项目的 .gitignore 文件: http://git-scm.com/docs/gitignore

【讨论】:

  • 这不是也阻止了我们在那个目录中开发吗?
  • 它将从提交中排除该目录。如果您希望仍然能够在该目录中开发,我会坚持使用子模块方法。见stackoverflow.com/questions/7912022/…
【解决方案2】:

首先,如果你只考虑 git 的工作原理,显然你不能将这些代码放在同一个 repo 中,所以你肯定需要多个 repositories。

根据你所说的,我可以假设没有那个目录 X,你的项目也可以工作,那么将它分开绝对是一个好主意。那么问题是如何组织你的 repo。

子模块功能只是将 sha1sum 引用保存到另一个存储库中的提交,该文件保存为根目录中名为 .gitmodules 的文件。每次提交子模块时,.gitmodules 文件都会像根 repo 中的普通文件一样更改,然后您需要在根 repo 提交以更新子模块的引用。克隆后不执行子模块初始化也可以工作。

现实世界中有很多如何使用子模块的例子。

https://github.com/owncloud/core/ 是一个带有 1 个子模块的仓库。

https://qt.gitorious.org/qt/qt5/ 有一个脚本可以让开发者选择性地启用某些子模块。

根据您的项目结构,您可以组织一个只有骨架的根存储库,其中包含许多子模块,例如 Qt;或者一个包含多个子模块的主仓库,这些子模块可能是可选的或独立于主项目。

确定结构后,您可能需要查看 git filter-branch 以了解如何将目录分隔到不同的 repo 并保留历史记录。

【讨论】:

  • 感谢您的详细解答。 Qt5 repo 看起来很有趣。我会看看我能不能从中学到一些东西。如果我们能克服子模块“必须进入每个目录并分别提交”的麻烦,我认为 Qt5 是一个很好的案例。
猜你喜欢
  • 2015-11-21
  • 2017-06-03
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2013-05-25
  • 2014-12-19
相关资源
最近更新 更多