如何将 git 存储库中的目录镜像到另一个 git 存储库中?

How can I mirror a directory in a git repo into another git repo?

我在 RepoA 中有一个目录 /amp 和一个 RepoB(最初填充了 /amp 的内容)。我想将 RepoA 中 /amp 的任何更改镜像到 RepoB 中。

可能吗?

P.S: RepoA 包含许多其他目录。我只想镜像 /amp 目录。而 RepoB 只会包含 /amp 内容,而不会包含任何其他内容。

如果 RepoB 将只有 /amp 内容,那么从中创建一个库更为正确。将此库作为 RepoA 中项目的依赖项。具体操作取决于您使用的语言(包管理器)。

对于开发环境,您可以在 RepoA 中创建指向 RepoB 的符号链接。

您可以为此使用 git submodules,第一步是从您的目录 /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

现在,在 repoArepoB 上,您需要将新的 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"

请注意,我给 repoArepoB 中的目录起的名字是 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"

我希望这可以帮助您更好地理解。

如果您不喜欢子模块,另一种方法是 content filter driver in a .gitattributes 的 repoA,用于 /amp/.

中的所有文件

Pro Book:

更具体地说,“clean”过滤器将在 git commit 上自动调用(仅适用于 /amp/** files),然后可以执行必要的命令以复制更改在 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"

nbari 的回答是正确的,子模块旨在解决这个问题。

子模块的一个潜在缺点是它们对用户不完全透明。如果您希望某些人能够使用 RepoARepoB 而无需了解任何有关子模块的知识,另一种选择是 git subtree。您必须使用的主要命令是:

  • git subtree split,可以从 RepoA 中提取子目录 amp 到它自己的存储库,例如 RepoAMP(您也可以使用 git subtree push推送结果)。

  • git subtree merge可以合并RepoAMPRepoB目录/amp(也可以用git subtree pull下载合并在一个命令中)。

最后,RepoARepoB 都是 "normal" 存储库。镜像不会自动完成,但 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 笔记和其他一些属性。