我想从我的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项目外部更新子模块。
答案 0 :(得分:2)
我可以通过git --git-dir=<path-to-repo>\.git\modules\<submodule-name>
这是因为子模块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