我在/amp
和RepoA
中有一个目录RepoB
(最初填充了/ amp的内容)。我想将RepoA中/amp
的任何更改镜像到RepoB。
有可能吗?
P.S:RepoA包含许多其他目录。我只想镜像/ amp dir。而RepoB只会使/ amp内容与其他内容不同。
答案 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
现在在repoA
和repoB
,您需要将新的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"
请注意,我在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
回购进行更改时,您都需要更新“拉”存储库中的更改,例如:
$ 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的回答是正确的,子模块旨在解决这个问题。
子模块的一个潜在缺点是它们对用户来说不是完全透明的。如果您希望某些人能够使用RepoA
和RepoB
而无需了解子模块,则可选择git subtree。您必须使用的主要命令是:
git subtree split
,可以从amp
将子目录RepoA
提取到自己的存储库,比如RepoAMP
(您也可以使用git subtree push
推动结果)。
git subtree merge
可以将RepoAMP
合并到/amp
中的目录RepoB
(您也可以使用git subtree pull
下载并合并到一个命令中)
最后,RepoA
和RepoB
都是“普通”存储库。镜像不是自动完成的,但git subtree
可以帮助您正确完成。
答案 2 :(得分:0)
如果子模块不符合您的喜好,则/amp/
中所有文件的替代方法是content filter driver in a .gitattributes
repoA。
请参阅Pro Book:
更具体地说,将在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的符号链接。