将git仓库中一个文件夹的更改自动推送到github?

5

我有一个代码库,其中有一个文件夹用于存放我想要开源的内容,以便与私有部分区分开来。是否有一种方法可以让git自动将提交到该文件夹的任何内容推送到github存储库,而无需每次都记得推送新更改的文件?我想将整个代码库推送到另一个github位置。

2个回答

8
如果您有一个仓库,其中一部分是公开的,另一部分是私有的,那么您需要在仓库设置中进行根本性的更改。Git跟踪完整的仓库,因此您可以将仓库设置为公开或私有,但不能部分公开和部分私有。
如果您既有包含“公共”文件的仓库,又有包含“私有”文件的仓库,则可以向“公共”仓库添加git挂钩以自动推送提交,并保持私有仓库的私有性。
然而,您写道您有一个包含“公共”和“私有”文件的单个仓库,因此您需要将其拆分为“公共”和“私有”的某些内容。
您有多种选项来解决这种情况:
  1. 将“public”文件夹拆分为自己的存储库,您将推送到github。这将稍微重写“public”文件夹的历史记录。我将在下面更详细地概述此内容。

  2. 创建一个仅涉及“public”文件夹的分支,并仅发布该分支。从“意外推送”,即发布私人内容的角度来看,这是有风险的,如果您有任何同时涉及“public”和“private”文件的提交,则无法实现或至少非常困难,因此我建议不要选择此选项,并且不会再写更多内容。

要将“public”文件夹拆分为自己的存储库,请从“combined”分支创建一个新的“public”分支,并在其上使用git filter-branch,使新的“public”分支仅包含来自“public”文件夹的内容。“示例”部分显示了恰当的--subdirectory-filter示例)。然后,您将拥有旧的“combined”分支,其中包含“public”文件夹和私人内容,以及仅包含“public”文件夹的新“public”分支。

请注意,例如新的“公共”分支中的提交消息仍可能包含“私有”信息。因此,您应该浏览所有提交消息,扫描其中的私有信息,并可能使用{{link1:git rebase -i}}删除该私有信息。

更新: [仅推送“公共”分支而不是其他任何内容可能不会传输任何其他信息,因此可能不需要清理此仓库。] 如果您需要进行任何删除操作,则需要使用{{link2:git gc}}从仓库中删除旧的未经编辑处理的版本(可能需要使用--prune=0--aggressive选项-但我找不到更多关于此的SO答案)。

现在您的“public”分支已准备好发布。为确保它仅包含“public”信息,您可以将其推送到一个新的空本地裸库中,检查该内容以验证所有引用均不包含私人信息。满意后,您可以将“public”分支推送到github上的一个新的空仓库中。然后,github上的仓库将仅包含“public”分支,您应该在github仓库上将其命名为“master”。
您的带有“combined”分支的本地仓库仍然直接包含公共和私有信息,并且与新的“public”github仓库没有任何连接。
现在,您可以重写“combined”分支的历史记录,仅包含非公共部分,但这将牺牲“public”和“private”文件状态之间所有历史记录的连接,因此旧版本的可重复构建将变得几乎不可能。因此,我建议保持“combined”分支的历史记录不变,并在新提交中仅删除“public”文件夹。
如果你的私有文件和公共文件之间的集成非常紧密且版本相关,你可以使用git submodule将来自github的“public” repo的特定版本添加到你的私有repo中。一个新的子模块文件夹,其名称与以前的“public”文件夹相同,将最小化对你的私有内容的更改,因为所有“public”文件都将在它们的旧路径中。请注意,当有东西被推送到github时,子模块文件夹不会自动更新。你可以通过向本地子模块文件夹添加git hook来解决这个问题,在“combined” repo中更新子模块信息。
如果你的私有文件和公共文件之间的集成比较松散,你也可以像任何外部第三方项目一样处理公共文件,并将其集成到你的私有内容中,即像你的“私有”软件依赖于任何外部软件一样。

是的,公共和私有内容之间的紧密集成是我想要将它们保留在一个仓库中的原因。当我处理使用公共内容的私有内容时,公共内容大多数情况下会发生变化,因此我不想进行拉取操作。此外,我希望能够标记私有仓库的状态,并包含当前版本的公共内容。 - uliwitness
Git子模块记录了子模块提交的SHA。如果您标记私有存储库,则该标记将包括所有子模块的提交SHA。因此,您可以获得所需的紧密耦合。 - ndim

0

使用 githook 在提交时进行推送。


那不会把整个代码库都推送上去吗?我该如何从中提取出那个文件夹及其内容呢? - uliwitness
子模块化文件夹,推送后钩子。 - databyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接