2

目前正在做一个项目。我们希望用完整的信息(作者等)开源我们的日常提交,同时过滤掉一些特定的私人文件夹。

假设我在分支 master 中提交 A/file1 和 B/file2,我希望将其镜像到 GitHub 上并过滤 B 文件夹(此提交只有 A/file1)。

我想这样做的一种方法是远程更新挂钩:

  • 列出 newref 添加的所有新提交(比如说 lastfoundcommit..newref)
  • 逐一修改这些提交(从 lastfoundcommit 到 newref)以删除不需要的文件
  • 在此过程中,它可能会创建一个本地主过滤分支(如果它有助于在本地拥有它)
  • 将此分支推送到公共存储库
  • 以某种方式在私有和公共提交之间保留提交 ID 的映射,以便在下次推送时轻松计算“lastfoundcommit”

理想情况下,它可以是双向的(即,如果我们也可以导入回 github 分支并拉取请求,并让它们“重新定位”在我们的私有存储库之上,无论是自动还是通过简单的过程——可能并不难因为它可能只是一个变基)。

这有点类似于 git-subtree 可以做的,除了它不是提取子目录而是过滤各种文件。

这看起来可行吗?或者有什么其他建议?(可能基于 git filter-branch?或任何其他可能对我有帮助的现有工具/脚本?)

注意:子模块不是一个可行的选择,因为它们可能很稀疏并且会妨碍太多。此外,“私人”文件列表可能会随着时间的推移而扩展/更改。

4

2 回答 2

0

你的计划很好,除了它应该git filter-branch用来重写提交。该filter-branch命令专为此类目的而设计,并为您提供了以您希望的任何方式重写提交的最大权力。

让您提供的脚本filter-branch记录从旧到新的提交映射非常容易。

就是说,即使您说子模块不是一个可行的选择,但在我看来,在顶层使用“私有”文件夹实际上是一个单独托管的 git 存储库比您提议的历史重写更好。它更不容易出错,更容易实现,也更容易理解。

于 2015-07-19T22:08:19.607 回答
0

我也遇到过类似的情况:

不要使用 git filter 分支

请改用BFG 回购清洁剂。它更快更容易使用。

您需要定期修剪 repo 中的所有提交,以免提及您的私人文件夹/文件。

划分存储库

拥有完整的 repoOSS 之一。让您的脚本将文件从一个文件传输到另一个文件,并对 OSS 之一进行特殊测试,这样您就无法在其中找到不应该的内容。

两个存储库都应该在您的网络中,最好在同一台机器上(安全)。仅允许、检查和清理来自 OSS 存储库的分支离开机器(推送到 GitHub 或任何地方)。

使用子模块

使用子模块/子树进行 POC,看看它们是否不会比脚本更好地工作。你会浪费额外的 2 个小时并且肯定知道。我确实认为它们可能是可行的选择,因为你们有私人文件夹......

使用项目忽略和 .git/info/exclude

您可以使用.git/info/exclude排除 OSS 存储库中的私有文件和文件夹,这样即使有目的地避免 Git 关注它们的信息也不会泄漏。

在您通常的存储库中,您可以将这些文件添加到 .gitignore 的一个分支上,用作初始过滤器,稍后用于提供 OSS 存储库。

于 2016-04-18T18:56:01.823 回答