来自不同目录的git子模块更新

时间:2017-03-08 15:58:51

标签: git git-submodules

我想从我的git项目外部运行一个子模块更新。对于大多数命令(例如git status),我可以给出git --git-dir--work-tree参数,如下所示:

git --git-dir=/path/to/root/.git --work-tree=/path/to/root status

但是,运行git --git-dir=/path/to/root/.git --work-tree=/path/to/root submodule update会得到结果:fatal: $program_name cannot be used without a working tree.

我知道我可以切换到/path/to/root目录,但是我想知道git是否能够从git项目外部更新子模块。

2 个答案:

答案 0 :(得分:2)

我可以通过git --git-dir=<path-to-repo>\.git\modules\<submodule-name>

从主存储库外的子模块中运行git命令

这是因为子模块git目录位于.git\modules\<submodule-name>文件夹中,而不是在子模块本身内(除非您首先在现有存储库的顶部创建了子模块,在这种情况下您可以运行{{ 1}}解决这个问题)。请注意,在新的克隆中,git submodule absorbgitdirs文件夹在您第一次运行.git\modules\<submodule-name>之前不会存在。

但是,当我尝试使用git submodule update主存储库运行git submodule update时,我遇到了同样的问题。无论是否指定工作树,它都不起作用。我想知道这是一个错误,还是我们做错了什么。

但是,由于我链接的第一个命令有效,您可以执行以下操作:

--git-dir

将从主存储库外部的子模块中运行git pull。

答案 1 :(得分:0)

我的用例是初始化/更新Lerna / yarn工作区仓库中的子模块。

答案在这里:https://stackoverflow.com/a/35899275

结合查看-C flag的git docs和using submodules的git docs,我得出:

git -C ./dir/to/submodule submodule update --init

与git文档不同,与git --git-dir--work-tree相比,-C标志“ Run [s]就像git在{{1}中启动一样},而不是当前的工作目录。”

然后,我将脚本作为脚本添加到package.json中,以使更新变得更容易,并且使参与者可以开始使用

更新上面的命令仅适用于初始化。我发现我必须运行此命令才能将子模块实际“更新”为最新版本:

<path>

注意:上述init命令的替代方法是在第一次克隆存储库时添加git -C ./dir/to/submodule pull <remote> <branch> 标志:

--recurse-submodules