git镜像到GitHub并过滤私有文件
目前正在进行一个项目。我们希望在过滤掉一些特定的私人文件夹的同时,用完整的信息(作者等)公开我们的日常提交 假设我在branch master中提交A/file1和B/file2,我希望在GitHub上镜像它,并过滤B文件夹(此提交将只包含A/file1) 我考虑的一种方法是使用远程更新挂钩:git镜像到GitHub并过滤私有文件,git,github,version-control,git-filter-branch,git-amend,Git,Github,Version Control,Git Filter Branch,Git Amend,目前正在进行一个项目。我们希望在过滤掉一些特定的私人文件夹的同时,用完整的信息(作者等)公开我们的日常提交 假设我在branch master中提交A/file1和B/file2,我希望在GitHub上镜像它,并过滤B文件夹(此提交将只包含A/file1) 我考虑的一种方法是使用远程更新挂钩: 列出newref添加的所有新提交(比如lastfoundcommit..newref) 逐个修改这些提交(从lastfoundcommit到newref),以删除不需要的文件 在此过程中,它可能会创建一
- 列出newref添加的所有新提交(比如lastfoundcommit..newref)
- 逐个修改这些提交(从lastfoundcommit到newref),以删除不需要的文件
- 在此过程中,它可能会创建一个本地主筛选分支(如果它有助于在本地进行筛选)
- 将此分支推送到公共存储库
- 以某种方式在私有和公共提交之间保持提交ID的映射,以便在下一次推送时轻松计算“lastfoundcommit”
注意:子模块不是一个可行的选择,因为它们可能是稀疏的,并且它会阻碍太多。此外,“私有”文件列表可能会随着时间的推移而扩展/更改。您的计划很好,只是它应该使用
git过滤器分支来重写提交。filter branch
命令是为类似的目的而设计的,它为您提供了以任何方式重写提交的最大能力
让您提供给过滤器分支的脚本记录从旧到新的提交映射是非常容易的
也就是说,尽管你说子模块不是一个可行的选择,但在我看来,在顶层使用一个“私有”文件夹(实际上是一个单独托管的git存储库)比你建议的重写历史要好。它不容易出错,更容易实现,更容易理解。我也遇到过类似的情况:
不要使用git过滤器分支
改用。它的速度更快,使用更方便
您需要定期删除回购协议中的所有提交,以避免提及您的私人文件夹/文件
划分存储库
拥有完整的回购协议和OSS one。让你的脚本将文件从一个传输到另一个,并在OSS one上进行特殊测试,这样你就无法在那里找到你不应该找到的东西
两个存储库都应该在您的网络中,最好在同一台机器上(安全性)。仅允许、检查和清理OSS repo的分支离开机器(推送到GitHub或任何地方)
使用子模块
对子模块/子树进行POC,看看它们是否比脚本工作得更好。你会再浪费2个小时,而且你肯定知道。我认为他们可能是可行的选择,因为你们有私人文件夹
使用项目忽略和.git/info/exclude
您可以使用.git/info/exclude
来排除OSS repo中的私有文件和文件夹,这样即使是有意避开git注意的私有文件和文件夹的信息也不会泄露出去
在通常的repo上,您可以将这些文件添加到.gitignore的一个分支上,该分支用作初始过滤器,稍后用于向OSS repo提供信息