如何使用两个Git repos,一个完整,另一个部分

时间:2013-11-08 04:37:47

标签: macos git github git-submodules git-subtree

考虑以下情况:

Remote repo A (master):
  dir 1
  dir 2
  file 1
  file 2

Remote repo B (branch):
  dir 1
  file 1

我想要做的是保持两个repos中的公共文件同步。当我提取时,我希望从Repo B的公共文件中获得Repo A更改的所有更改。同样,当我推送时,我希望本地更改只发布到两个repos中的公共文件。存在于repo A但不存在于repo B中的文件应保持不受影响。

Git支持吗?

2 个答案:

答案 0 :(得分:1)

经过数小时的研究,我决定采用git子树合并。不是git subtree,这是一个git contrib工具(谈论行话重载)但是策略Git - Subtree Merging。我的决定背后的原因如下:

  1. Web上充满了使用git子模块的警告。更重要的是,对我来说,绝对有必要在两个repos中保留公共文件的物理副本,而不仅仅是指向远程仓库的指针。我还希望能够更新子模块不提供的主要或子树的代码。所以git子模块就出来了。

  2. git子树工具看起来不错,并且有很多粉丝,但经过仔细检查,它似乎与子树合并策略非常相似(事实上,有人说它是围绕子树合并的一个很好的装饰者)。它有一些额外的功能,比如在合并时压缩子树历史的能力,但这是以学习推送代码的新方法为代价的。另外,它还不是标准git二进制文件的一部分(Mac上的Git 10.8.4.2,预构建的二进制文件),并且每次发布错误修复时我都不想手动安装升级。

  3. 感谢那些花时间回答我的问题的人,特别是@dekdev,他也试图帮我聊聊。

答案 1 :(得分:0)

  

那些是独立的团队   B的用户无需访问我的仓库C,如果我制作子模块,他们就需要这样做。
  同样,A的用户也无权访问B   代码在两个单独的repos之间共享的事实需要对repos的当前用户透明。他们可以处理他们的个人回购,但不是两者兼而有之。

然后你需要某种自动钩子:

  • AB上的每次提交检查常见文件是什么
  • 将这些公共文件的更新推送到其他repo

那假设:

  • 您可以访问AB个服务器(其中TeamATeamB正在推送)
  • 您可以在那里部署post-receive hook
  • 该钩子可以推送到另一个repo服务器(如果我们谈论相同的服务器,这可能很容易)。

注意:为了保护对repos(甚至是回购文件中的文件)的访问权限,以及 authorization layer gitolite可以提供帮助。