gpt4 book ai didi

git - 如何在 gitmodules 文件中指定标签?

转载 作者:行者123 更新时间:2023-12-03 17:34:15 27 4
gpt4 key购买 nike

我正在尝试设置一个通用的 .gitmodules 文件,以用作新项目总是需要的特定静态数量的子模块的模板。然后使用 Restore git submodules from .gitmodules 中显示的技术一次性初始化子模块:

#!/bin/sh

#set -e

git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
while read path_key path
do
url_key=$(echo $path_key | sed 's/\.path/.url/')
url=$(git config -f .gitmodules --get "$url_key")
branch_key=$(echo $path_key | sed 's/\.path/.branch/')
branch=$(git config -f .gitmodules --get "$branch_key")
if [ ! -d "$path" ]; then
echo URL - $url, Path - $path, Branch - $branch
if [ -n "$branch" ]; then
branch="-b $branch"
fi
git submodule add --force $branch $url $path
fi
done

但是,指定 似乎是不可能的。标签 .gitmodules 文件中的(而不是分支):
[submodule "externals/asio"]
path = externals/asio
url = https://github.com/chriskohlhoff/asio.git
branch = asio-1-11-0

这导致:
fatal: Cannot update paths and switch to branch 'asio-1-11-0' at the same time.
Did you intend to checkout 'origin/asio-1-11-0' which can not be resolved as commit?
Unable to checkout submodule 'externals/asio'

但是完全有可能做到这一点:
cd externals/asio
git co asio-1-11-0

关于如何指定特定 的任何想法标签 ?

我在 Stackoverflow 上没有找到答案,甚至建议重复,显示是否可以指定 标签 在 .gitmodules 中。此外,我发现的问题与使用 git 子模块有关,而不是使用 .gitmodules 文件到 。初始化 从头开始的 repo 。

最佳答案

我认为是您需要的答案(从逻辑上讲,这在下一节之后)
我想问题是当前索引中还没有子模块。您要做的是首先将子模块克隆到位(使用您认为合适的任何 git clone 命令),检查所需的提交(通过任何合适的方式 - 可能是相同的 git clone 命令),然后use git submodule add :

If <path> exists and is already a valid Git repository, then it is staged for commit without cloning.


换句话说,这将在 super 项目的 .gitmodules 中创建条目。文件,然后将当前 checkout 的子模块的提交哈希 ID 添加到 super 项目的索引中。您无需在此处添加分支,您只需添加 - 这使用已 checkout 的提交,就像标签一样。
您可能想运行 git submodule absorbgitdirs在所有这一切结束时,所有子模块 .git存储库迁移到 super 项目的 .git目录。 (对此没有要求,如果您的 Git 较旧,则不会有 absorbgitdirs 。)
设置:或者,如果上述内容没有意义,请先阅读此内容
子模块 check out 通常是分离的。也就是说,您在 Git 存储库中有一个“分离的 HEAD”,它是子模块:它的 HEAD 的内容文件是组成散列 ID 的 41 个字节。
当你第一次运行 git submodule update --checkout ,默认操作是:
  • 如果需要,使用 .gitmodules 中的指令克隆子模块 super 项目中的文件。
  • 查看由 super 项目的 gitlink 标识的特定提交。这是存储在 super 项目工作树索引中的哈希 ID。
    (令人讨厌的是,很难看到索引条目,因此很难看到相应的哈希 ID。您可以使用 git ls-files --stage <path>git rev-parse :0:<path> 来查看它。漂亮的前端界面 git show 无法显示子项目提交哈希!这似乎是一个错误。)

  • 无论是否存在分支设置,都会发生这种情况。与 git submodule update --rebasegit submodule update --merge ,分支设置开始变得重要。
    您也可以设置 submodule.name.updatecheckout , rebase , 或 merge , 在这种情况下 git submodule update --init服从您在此处设置的任何内容。然后分支设置将再次重要。但是如果你不设置这些, git submodule update --init默认为 git submodule update --checkout .
    通过哈希 ID check out 特定的提交会导致 HEAD 分离。
    按名称 checkout 标签也会导致分离的 HEAD — 特别是标签名称解析到的哈希 ID。
    标签名称永远不应该改变。假设这是真的。这意味着如果您在 gitlink 中将标签名称解析为的哈希 ID 作为原始哈希 ID 记录, git submodule update操作将导致 checkout 与 checkout 标签相同的提交哈希 ID,具有相同的分离 HEAD。因此这里不需要设置标签名,所以不要使用 -b <branch>完全可以选择。

    关于git - 如何在 gitmodules 文件中指定标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49490272/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com