首先,我已经阅读了以下所有内容:
- 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
,在将正式内部产品作为开源发布时,如何仅包含特定文件以及这些特定文件的历史记录?
额外奖励:有没有办法不在特定文件中包含特定行的历史记录(以及删除行)?
答案 0 :(得分:3)
最简单的方法是克隆整个仓库并了解filter-branch
的一些复杂性。
实际上并不那么难。根据它的布局方式,您可以编写一个小脚本,在构建新历史记录时删除某些文件的存在。如果需要,子目录过滤器可以填充部件。
要删除某些行,请使用annotate
查找引入要删除的行的版本,然后rebase -i that_revision^
删除它。它会导致一些rebase失败,但它们很容易处理。
这些类型的练习非常简单和安全,让您沿着通常不会使用git探索的路径前进。我想它会很有趣。 :)
答案 1 :(得分:-1)
您似乎正在寻找 git bundle :
http://www.kernel.org/pub/software/scm/git/docs/git-bundle.html