2017-03-13 76 views
1

我可以使用哪些函数将远程分支中的所有子模块(本地回购)同步/初始化/更新到版本?git - 检出分支和子模块

“同步”(让我们称呼它,我的意思不是混帐同步!)也必须工作时:

  • 子模块已添加只内的远程分支
  • 文件子模块已在本地添加/删除/修改。跟踪或未跟踪。
  • 子模块被删除(可选)

从本质上讲,我想当地的回购永远是在完全相同的版本作为远程分支。每当我改变子模块中的某些东西时,不需要太多的摆弄。因此,没有手动ssh到服务器初始化一个新的子模块,只为部署脚本工作...

这可以实现而无需克隆(又名。传输)整个存储库?我选择了git来安全快速地部署我的源代码。但我能想到的唯一选择是完成一个完整的git clone --recursive并在其各自的标签处检查子模块。在这种情况下,rsync可能会更好地同步文件。

+0

每个子模块也是它自己的存储库,所以如果顶级存储库R有三个子模块S0,S1,S2,那么您有* 4 *存储库需要担心。但是,如果您使用*参考克隆*,存储库便宜 - 不像分支便宜,但仍相当便宜。不过,子模块在patootie中仍然很痛苦。 :-) – torek

回答

2

git submodule update --init --recursive怎么样?它会将子模块更新为正确的提交,并在需要时对其进行初始化,并对所有子模块执行此操作,即使它们位于其他子模块中。如果没有放弃更改,请先尝试git submodule foreach --recursive git reset --hard

+0

我在部署分支中签出了一个子模块@ v1并推送了它。git submodule update --init --recursive可以工作,但是当我在推送到子模块repo之后再次运行它时,在tag v1之后,子模块更新 – NoMad

+0

也可以获得该更改吗?您可以详细说明您希望发生什么以及实际发生了什么发生?你在什么地方和子模块发生了什么? – oyvind

+0

嗯,我的评论没有发布......我现在已经解决了这个问题,在'git submodule update --init --recursive'之后,子模块的头部是''v2',但它应该已经在''v1',这个版本在myrepo中被检出。请参阅下面的答案 – NoMad

0

首先,在需要的位置和版本上手动添加和检出所需的子模块。要更新所有子模块,但保留已签出的回购包含它们各自的版本,可以使用

git submodule update --init --recursive --rebase --force 

--rebase会造成的git检查出确切的承诺,该子模块签出在包含回购。

如果本地回购对子模块文件进行了更改,则会失败,因此我们必须先重置所有子模块。对于脚本的使用:被直取自git undo all uncommitted changes

git submodule foreach 'git reset --hard && git checkout . && git clean -fdx' 
git submodule update --init --recursive --rebase --force 

复位命令 - 让我知道如果别的更适合这个用例。

不需要额外的配置,只需检查子模块@期望的提交或标签并推送包含回购中的更改。

这些命令满足我的前两个初始要求:只要git跟踪子模块,所有更改将完全同步到运行命令的“客户端”。如果删除了子模块,则可以在包含子模块的存储库上运行git clean以删除已组装的子模块文件。