如何将 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
现在,在 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"
我希望这可以帮助您更好地理解。
如果您不喜欢子模块,另一种方法是 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 的回答是正确的,子模块旨在解决这个问题。
子模块的一个潜在缺点是它们对用户不完全透明。如果您希望某些人能够使用 RepoA
和 RepoB
而无需了解任何有关子模块的知识,另一种选择是 git subtree。您必须使用的主要命令是:
git subtree split
,可以从 RepoA
中提取子目录 amp
到它自己的存储库,例如 RepoAMP
(您也可以使用 git subtree push
推送结果)。
git subtree merge
可以合并RepoAMP
到RepoB
目录/amp
(也可以用git subtree pull
下载合并在一个命令中)。
最后,RepoA
和 RepoB
都是 "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 笔记和其他一些属性。
我在 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
现在,在 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"
我希望这可以帮助您更好地理解。
如果您不喜欢子模块,另一种方法是 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 的回答是正确的,子模块旨在解决这个问题。
子模块的一个潜在缺点是它们对用户不完全透明。如果您希望某些人能够使用 RepoA
和 RepoB
而无需了解任何有关子模块的知识,另一种选择是 git subtree。您必须使用的主要命令是:
git subtree split
,可以从RepoA
中提取子目录amp
到它自己的存储库,例如RepoAMP
(您也可以使用git subtree push
推送结果)。git subtree merge
可以合并RepoAMP
到RepoB
目录/amp
(也可以用git subtree pull
下载合并在一个命令中)。
最后,RepoA
和 RepoB
都是 "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 笔记和其他一些属性。