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

时间:2017-01-19 07:21:29

标签: git github git-submodules git-subtree

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

有可能吗?

P.S:RepoA包含许多其他目录。我只想镜像/ amp dir。而RepoB只会使/ amp内容与其他内容不同。

4 个答案:

答案 0 :(得分:5)

您可以使用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 repo添加为子模块,这可以通过以下方式完成:

$ cd /path/to/repoA
$ git submodule add -b master git@github.com:<you-user>/amp ampMirror

repo 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回购进行更改时,您都需要更新“拉”存储库中的更改,例如:

$ 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"

我希望这有助于为您提供更好的主意。

答案 1 :(得分:2)

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

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

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

  • git subtree merge可以将RepoAMP合并到/amp中的目录RepoB(您也可以使用git subtree pull下载并合并到一个命令中)

最后,RepoARepoB都是“普通”存储库。镜像不是自动完成的,但git subtree可以帮助您正确完成。

答案 2 :(得分:0)

如果子模块不符合您的喜好,则/amp/中所有文件的替代方法是content filter driver in a .gitattributes repoA。

请参阅Pro Book

https://git-scm.com/book/en/v2/images/clean.png

更具体地说,将在clean上自动调用“git commit”过滤器(仅适用于/amp/** files),然后可以执行必要的命令以复制repoB中的更改{1}}。

那个干净的合并驱动程序脚本将是:

#!/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"

答案 3 :(得分:-1)

如果RepoB的内容只有public void execute(String command){ try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes(command); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); } } ,那么从中创建一个库就更正确了。将此库作为RepoA中项目的依赖项。如何操作取决于您使用的语言(包管理器)。

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