从不同目录更新git子模块

3
我想从我的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个回答

2
我的用例是在Lerna / yarn工作区存储库中初始化/更新子模块。
答案在这里:https://dev59.com/R2w05IYBdhLWcg3wmC0o#35899275 结合查看-C标志的git文档和使用子模块的git文档,我得出以下结论:
git -C ./dir/to/submodule submodule update --init

从Git文档中需要注意的主要事项与使用--git-dir--work-tree相反,-C标志"运行时就像git是在<path>而不是当前工作目录中启动的。"

然后我将其添加为我的package.json脚本,以使更新更加便捷,并方便贡献者开始。

更新上述命令仅适用于初始化。我发现我必须运行此命令才能实际"更新"子模块到最新版本:

git -C ./dir/to/submodule pull <remote> <branch>

注意:与上述 init 命令的替代方法是在首次克隆存储库时添加 --recurse-submodules 标志。
git clone --recurse-submodules <git-url>

2
我可以通过执行 git --git-dir=<path-to-repo>\.git\modules\<submodule-name> 命令在主存储库外部运行子模块中的 git 命令。
这是因为子模块的 git 目录位于 .git\modules\<submodule-name> 文件夹中,而不是子模块本身内部(除非您最初就在现有存储库之上创建了子模块,在这种情况下,您可以运行 git submodule absorbgitdirs 来解决此问题)。请注意,从一个全新的克隆开始,.git\modules\<submodule-name> 文件夹在第一次运行 git submodule update 之前都不存在。
然而,当我尝试使用主存储库的 --git-dir 运行 git submodule update 命令时,我遇到了与你相同的问题。无论是否指定工作树,它都不起作用。我想知道这是一个错误,还是我们做错了什么。
但是,由于我提供的第一条命令有效,您可以执行以下操作: git --git-dir=<path-to-repo>\.git\modules\<submodule-name> pull 这将从主存储库外部在子模块中运行 git pull 命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接