我在 RepoA
中有一个目录 /amp
,并且有一个 RepoB
(最初填充了 /amp 的内容)。我想将对 RepoA 中的 /amp
的任何更改都反映到 RepoB 中。
这是可能的吗?
P.S:RepoA 包含许多其他目录。 我只想镜像 /amp 目录。而 RepoB 只会包含 /amp 内容而不是其他任何内容。
我在 RepoA
中有一个目录 /amp
,并且有一个 RepoB
(最初填充了 /amp 的内容)。我想将对 RepoA 中的 /amp
的任何更改都反映到 RepoB 中。
这是可能的吗?
P.S:RepoA 包含许多其他目录。 我只想镜像 /amp 目录。而 RepoB 只会包含 /amp 内容而不是其他任何内容。
你可以使用Git子模块来实现此目的,第一步是从你的/amp
目录创建一个仓库,然后将其作为子模块在其他仓库中使用。
要将/amp
变成一个仓库,你可以执行以下操作:
$ cd /path/to/amp
$ git init
$ git add .
$ git commit -m "First commit"
现在假设您将使用Github,您可以通过以下方式发布您的存储库:
$ git remote add origin git@github.com:<your-user>/amp.git
$ git push -u origin master
现在在repoA
和repoB
中,您需要将新的amp
存储库作为子模块添加,可以通过执行以下操作完成:
$ cd /path/to/repoA
$ git submodule add -b master git@github.com:<you-user>/amp ampMirror
对于仓库repoB
同样适用
$ cd /path/to/repoB
$ git submodule add -b master git@github.com:<you-user>/amp ampMirror
$ git commit -m "added appMirror submodule"
注意,我在repoA
和repoB
中给目录取的名字是ampMirror
,但实际上你可以使用任何名称,事实上,只需使用以下命令即可使用相同的名称:
git submodule add -b master git@github.com:<you-user>/amp
目录结构将会长成这个样子:
repo(A/B)
├── .git/
├── .gitmodules <-- created after adding the submodule
├── foo
└── ampMirror
├── .git/ <-- repo to keep/track changes for app (need to git pull)
└── foo
现在,每当您对amp
存储库进行更改时,您需要更新“pull”您的存储库中的更改,例如:
$ cd /path/to/repoB
$ cd appMirror
$ git pull
$ cd .. <--- get back to your project root
$ git commit -am "update submodule"
如果有多个子模块,则另一种实现方式是:
$ cd /path/to/repo(A/B)
$ git submodule foreach git pull origin master
$ git commit -am "updated submodules"
希望这能帮助您更好地理解。
nbari的回答是正确的,子模块是为了解决这个问题而设计的。
子模块的一个潜在缺点是它们对用户不完全透明。如果你想让一些人能够使用 RepoA
和 RepoB
而不需要知道任何关于子模块的东西,一个替代方案是 git subtree。你需要使用的主要命令是:
git subtree split
可以将RepoA
的子目录amp
提取出来,创建一个独立的仓库RepoAMP
(你也可以使用git subtree push
将结果推送到新的仓库)。
git subtree merge
可以将RepoAMP
合并到RepoB
的目录/amp
中(你也可以使用git subtree pull
一次性下载和合并)。
最终,RepoA
和RepoB
都是“普通”的代码仓库。镜像不会自动完成,但是git subtree
可以帮助您正确地进行操作。
将git仓库的目录镜像到另一个git仓库有一种简单的方法:
git clone --mirror git@example.com/mirror-repository.git
cd mirror-repository.git
使用以下命令将更改推送到新仓库
git push --mirror git@example.com/new-mirror.git
这将获取镜像仓库中可用的所有分支和标签,并将其复制到新位置。
请勿在没有使用--mirror克隆的仓库中使用git push --mirror。它会用您的本地引用(和本地分支)覆盖远程仓库。git clone --mirror优于git clone --bare,因为前者还克隆了git notes和其他一些属性。
如果RepoB只会有/amp
内容,那么从中创建一个库更加准确。将此库作为依赖项放入RepoA的项目中。如何操作取决于您使用的语言(包管理器)。
对于开发环境,您可以在RepoA中创建符号链接,指向RepoB。
.gitattributes
中使用内容过滤驱动程序,用于所有位于/amp/
中的文件。clean
" 过滤器将在 git commit
时自动调用(仅针对 /amp/** 文件
),然后可以执行必要的命令以便在 repoB
中复制更改。#!/bin/sh
git --work-tree=/path/to/repoA/amp --git-dir=/path/to/repoB/.git add .
git --git-dir=/path/to/repoB/.git commit -m "import from repoA/amp"