我有一个我工作的存储库.那里有一个文件夹,我把所有想要开源的东西放在一起,所以它与私有部分分开.有没有办法自动获取git将任何提交到该文件夹的内容推送到github存储库,而不必每次都记得将新更改的文件推送到那里?我想将整个存储库推送到另一个github位置.
如果您有一个存储库,其中部件是公共的,而部件是私有的,那么您需要从根本上更改存储库设置中的某些内容.git跟踪完整的存储库,因此您既可以将存储库设置为公共存储库,也可以将其设置为私有存储库,
如果你有一个带有"public"文件的repo和一个带有"private"文件的repo,你可以在"public"repo中添加一个git钩子来自动推送提交,并保持私有repo私有.
但是,你写的是你有一个包含"公共"和"私人"文件的repo,所以你需要把它分成"公共"和某种"私有"的东西.
您有许多选项可以解决这种情况:
将"public"文件夹拆分为自己的存储库,然后将其推送到github.这将重写"公共"文件夹的历史记录.我将在下面更详细地概述这一点.
创建仅涉及"public"文件夹的分支,并仅发布该分支.这在"意外推送,即发布,隐私"的意义上是有风险的,如果你有任何触及"公共"和"私人"文件的提交,那么完全不可能或者至少很难做到,所以我建议不要这样做选项,并不会写更多关于它.
要将"public"文件夹拆分为自己的存储库,请在"组合"分支git filter-branch
上创建一个新的"公共"分支,并使用它来使新的"public"分支仅包含"public"文件夹中的内容."示例"部分显示了正确的 - 子目录 - 过滤器示例).然后,您将拥有旧的"组合"分支,其中包含"public"文件夹和其中的私有内容,以及仅包含"public"文件夹的新"public"分支.
请注意,例如新"公共"分支中的提交消息仍可能包含"私有"信息.因此,您应该浏览所有提交消息,扫描它们以获取私人信息,并可能删除该私人信息,例如git rebase -i
.
更新: [后续只推送"公共"分支,没有其他任何东西可能不会传输任何其他信息,所以可能不需要这个repo清理.]如果你需要做任何修改,你会想要删除旧的未编辑使用
git gc
(可能使用--prune=0
和--aggressive
选项 - 来回购使用回购- 但我找不到有关更多信息的SO答案).
现在,您的"公共"分支已准备好发布.为了确保它只包含"公共"信息,您可以将其推送到一个新的空本地裸仓库,检查其内容以验证所有引用没有私人信息.在您满意之后,您可以将"public"分支推送到github上的新空回购.然后github上的repo只包含"public"分支,你应该在github repo上命名为"master".
具有"组合"分支的本地仓库仍然直接包含公共和私人信息,并且与新的"公共"github仓库没有任何关联.
现在你可以重写"组合"分支的历史记录只包含非公共位,但这会牺牲所有历史记录中"公共"和"私有"文件状态之间的所有连接,因此可重复构建的旧东西会变得几乎不可能.因此,我建议单独保留"组合"分支的历史记录,只需在新提交中删除"public"文件夹.
如果私有文件和公共文件之间的集成非常严格且依赖于版本,则可以使用git submodule
从github将特定版本的"public"repo添加到私有仓库中.一个新的子模块文件夹就像前"public"文件夹一样,它将最大限度地减少对私有内容的更改,因为所有"公共"文件都将在旧路径中.请注意,当某些内容被推送到github时,子模块文件夹不会自动更新.您可以通过向本地子模块文件夹添加git钩子来解决这个问题,该文件夹将更新"组合"仓库中的子模块信息.
如果您的私人文件和公共文件之间的集成更加松散,您还可以像处理任何外部第三方项目一样处理公共文件,并将其与其他任何人集成它的方式集成到您的私有资料中,即像任何外部部分你的"私人"软件所依赖的软件.