Get "please make sure that the .gitmodules file is in the working tree" when 运行 the git submodule add command

Get "please make sure that the .gitmodules file is in the working tree" when running the git submodule add command

我是 git 的新手,目前正在考虑从 Mercurial 移植一些大型项目。我们有一个根项目,它只包含对所有外部项目(git 中的子模块)的引用。我正在尝试在 git.

中重新创建它

我已将项目 (foo) 导入 githib。我创建了一个新的空项目 (root) 并将其克隆到本地。我想使用

添加 Foo 作为子模块
git submodule add https://github.com/.../foo.git

来自/c/Work/GitHub/root(大师)

但我一直收到 "please make sure that the .gitmodules file is in the working tree"。

查看文档,此命令的第一个 运行 应该创建 .gitmodules 文件,但即使我手动创建它也会出现此错误。在 Google 上寻找这个错误只是 returns 有错误的源文件,但没有解释为什么我得到它。我认为这只是我对 git.

的理解不足

我做错了什么?

编辑: 我也试过了。

mkdir test
cd test
git init
git submodule add https://github.com/.../foo.git

我得到同样的错误。

check you're probably failing is:

int is_writing_gitmodules_ok(void)
{
        struct object_id oid;
        return file_exists(GITMODULES_FILE) ||
                (get_oid(GITMODULES_INDEX, &oid) < 0 && get_oid(GITMODULES_HEAD, &oid) < 0);
}

这意味着该文件要么存在于本地,要么存在于暂存区或当前HEAD提交中。

您曾经使用过 git add,但随后将其从工作目录中删除。

使用 git restore .gitmodules(或类似方法)将现有文件放回您的工作目录。

以防其他人遇到此问题。我的 git 安装有问题。我卸载并重新安装它,错误消失了。

硬重置,例如到最后一次提交或提交所有更改为我解决了问题。

我认为在这种情况下,消息应该类似于“首先提交您的更改”之类的内容。

您可能删除了 .gitmodule 或对 .gitmodule 进行了更改。

尝试使用 git restore .gitmodule 恢复文件。

如果这没有帮助,请尝试检查 git status 以确保没有任何内容;否则 运行 git reset .gitmodule.

There was something wrong with my git installation. I uninstalled and reinstalled it the error went away.

考虑到 git-submodule.sh 的当前版本失败于:

 if ! git submodule--helper config --check-writeable >/dev/null 2>&1

如果可能的话,你有一个进程在你的 .gitmodules 上保持句柄,防止任何“git submodule add”命令修改它。

请注意,随着 Git 2.33(2021 年第 3 季度),这会略有变化,在 C 中重写“git submodule"(man),这确实会影响 git submodule add :

参见 commit bbe3165 (23 Jul 2021) by Jeff King (peff)
参见 commit 8c8195e, commit a98b02c, commit 0008d12 (10 Jul 2021), and commit 84069fc (06 Jul 2021) by Atharva Raykar (tfidfwastaken)
(由 Junio C Hamano -- gitster -- in commit 10f57e0 合并,2021 年 8 月 4 日)

submodule: prefix die messages with 'fatal'

Signed-off-by: Atharva Raykar
Mentored-by: Christian Couder
Mentored-by: Shourya Shukla

The standard die() function that is used in C code prefixes all the messages passed to it with 'fatal: '.
This does not happen with the die used in 'git-submodule.sh'.

Let's prefix each of the shell die messages with 'fatal: ' so that when they are converted to C code, the error messages stay the same as before the conversion.

Note that the shell version of die exits with error code 1, while the C version exits with error code 128. In practice, this does not change any behaviour, as no functionality in 'submodule add' and 'submodule update' relies on the value of the exit code.

并且:

submodule--helper: introduce add-clone subcommand

Signed-off-by: Atharva Raykar
Mentored-by: Christian Couder
Mentored-by: Shourya Shukla
Based-on-patch-by: Shourya Shukla
Based-on-patch-by: Prathamesh Chavan
Helped-by: Đoàn Trần Công Danh

Let's add a new "add-clone" subcommand to git submodule--helper with the goal of converting part of the shell code in git-submodule.sh related to git submodule add(man) into C code.
This new subcommand clones the repository that is to be added, and checks out to the appropriate branch.

This is meant to be a faithful conversion that leaves the behavior of 'cmd_add()' script unchanged.