Git:将特定文件和历史从一个存储库传输到另一个存储库

时间:2011-05-01 22:30:19

标签: git

首先,我已经阅读了以下所有内容: - Is it possible to move a bunch of files from one git repository to another while preserving (most) history? - Remove sensitive files and their commits from Git history - Can I pull only certain files from another git repository? 我一直无法使这些解决方案起作用,可能至少部分是因为我不熟悉高级git命令,例如git rebase

背景

在过去的一年里,我一直在一个网站上为其他一些程序员做志愿服务,用于编写一个NPO。在这个过程中,我开发了一个分布式,模块化,多线程,容错的Web框架,它使用并发进程实现,并结合调度到各个模块的反向http代理。 Web框架是由我编写的,尽管有其他程序员编写的模块。我们所有的更改都被推送到一个中央git存储库,包括模块,框架,库(jQuery,tinymce等)。

鉴于创建此框架所涉及的大量工作,以及目前缺乏针对程序员的解决方案,我正在考虑将该项目作为开源发布。但是,我只想发布实际的框架,而不是模块,库或其他位于repo中的东西。特别是,至少有一个模块使用硬编码的身份验证密钥来访问Web API,这是您在公开发布中肯定不希望拥有的内容(尽管安全问题不足以成为一个安全问题。在网站上工作的其他程序员的问题)。此外,反向http代理检查cookie的值,以便允许整个站点受密码保护,cookie的值是硬编码的。

如果可能的话,从git获取提交历史将是一项资产,因为它会向正在调查框架的人员展示其有历史,并向他们展示其设计的演变以及所涉及的设计决策。

问题

使用git,在将正式内部产品作为开源发布时,如何仅包含特定文件以及这些特定文件的历史记录?

额外奖励:有没有办法不在特定文件中包含特定行的历史记录(以及删除行)?

2 个答案:

答案 0 :(得分:3)

最简单的方法是克隆整个仓库并了解filter-branch的一些复杂性。

实际上并不那么难。根据它的布局方式,您可以编写一个小脚本,在构建新历史记录时删除某些文件的存在。如果需要,子目录过滤器可以填充部件。

要删除某些行,请使用annotate查找引入要删除的行的版本,然后rebase -i that_revision^删除它。它会导致一些rebase失败,但它们很容易处理。

这些类型的练习非常简单和安全,让您沿着通常不会使用git探索的路径前进。我想它会很有趣。 :)

答案 1 :(得分:-1)