git镜像到GitHub并过滤私有文件

时间:2015-07-14 16:06:53

标签: git github version-control git-filter-branch amend

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

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

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

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

理想情况下它可以双向进行(也就是说,如果我们还可以导入回github分支并拉取请求并将它们“重新定位”在我们的私有存储库之上,自动或使用简单的进程,那将是很好的 - 可能没那么难,因为它可能只是一个变种)。

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

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

注意:子模块不是一个可行的选项,因为它们可能很稀疏,而且会过多。此外,“私人”文件列表可能会随着时间的推移而延长/变化。

2 个答案:

答案 0 :(得分:0)

您的计划没有问题,但应该使用git filter-branch来重写提交。 filter-branch命令是为这些目的而设计的,它为您提供了以您想要的任何方式重写提交的最大功能。

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

尽管如此,即使你说子模块不是一个可行的选择,我认为使用"私有"顶级文件夹实际上是一个单独托管的git存储库,比你提议的历史重写更好。它不易出错,更容易实现,也更容易理解。

答案 1 :(得分:0)

我一直处于类似情况:

不要使用git filter branch

请改用BFG repo cleaner。它的 MUCH 更快更容易使用。

您需要定期修剪回购邮件中的所有提交,不要提及您的私人文件夹/文件。

划分存储库

拥有完整的回购 AND OSS。让你的脚本将文件从一个文件传输到另一个文件,并对OSS进行特殊测试,这样你就可以找到你不应该的东西。

两个存储库都应该位于您的网络中,最好是在同一台计算机上(安全性)。 OSS repo中只允许,检查和清除分支离开机器(推送到GitHub或任何地方)。

使用子模块

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

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

您可以使用.git/info/exclude排除OSS回购中的私人文件和文件夹,这样即使Git注意也不会故意避免有关它们的信息泄露。

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