git 嵌套独立存储库

qacovj5a  于 2023-01-24  发布在  Git
关注(0)|答案(1)|浏览(131)

我怀疑这个问题在互联网的不同角落经常被问到,但我没有找到一个可行的答案。
想象一下:

  • 存在包含文件夹A、B和C的储存库X。
  • repo X有一个遥控器,我们称之为RemoteX。
  • 在文件夹B内,存在独立储存库Y。
  • repo Y有自己的远程存储器RemoteY。
  • 所有的工作都是在存储库X中以常规的方式完成的。
  • 偶尔,快照从文件夹B推送到存储库Y。在某种程度上是"备份"。
  • repo Y只有1个分支,没有开发,纯粹作为独立版本控制的云存储repo存在。
  • 远程X应包含所有文件夹的所有内容(文件夹B的. git文件夹除外)

如何实现呢?我有90%的把握子模块/子树不是最好的方法。
我已经尝试过将B/. git添加到repo X的gitignore中,但没有效果。
UPD:这里有一些可视化的更精确

Repo X ---> Remote X (Server X)
|
|
.git
|
A
|
B ---> Repo Y ---> Remote Y (Server Y) 
|      |
|      .git
|
C
rqqzpn5f

rqqzpn5f1#

考虑git-subrepo

它可以处理你的场景,尽管在幕后它做了一件不同的事情,它没有一个冗余的repo Y .git目录(因为所有的历史记录都已经存在于repo X的.git目录中),而是在repo Y的根目录下有一个.gitrepo文件,这个文件只包含关于subrepo的元数据(例如,它的remote,与remote的同步状态,等等)。
它的好处是,回购X将看起来完全一样,如果Y文件夹就像一个普通的文件夹。
如果Y已经存在,下面是将其初始化为subrepo的命令:

git subrepo init <subdir> [-r <remote>] [-b <branch>] [--method <merge|rebase>]

将现有子目录转换为子存储库。
如果你想把你项目的一个子目录公开为一个发布的子存储库,这个命令可以做到这一点。它会把一个普通子目录的内容拆分成一个分支,并开始作为子存储库跟踪它。之后,你的原始存储库看起来完全一样,除了有一个<<subdir/.gitrepo〉〉文件。
如果指定--remote(和可选的--branch)选项,这些值将添加到<subdir>/.gitrepo文件中。--remote选项是上游URL,--branch选项是要推送到的上游分支。执行git subrepo push命令时需要这些值,但是它们可以在push命令中稍后提供(如果您还指定了--update选项,则保存到<<subdir/.gitrepo〉〉)。
注意:您需要创建空的上游回购,并使用git subrepo push <subdir>自己推送到它。
--method选项将决定如何执行分支之间的连接过程。默认选项为merge。
init命令接受--branch=--remote=选项。

相关问题