首页 > 解决方案 > 如何告诉 git 我只想添加子 repo 的当前文件内容,而不是 repo 作为子模块

问题描述

如果您在另一个 git 存储库中克隆 git 存储库(例如,将库或插件的代码安装到父存储库中),似乎不可能将该目录的文件内容作为简单的文件提交添加到父存储库,除非您首先删除或移动子仓库的.git目录。

您可能希望将 repo 添加为子模块,在这种情况下git add submodule <child_repo_url> <child_folder>会将其添加为两个文件:

new file:   .gitmodules
new file:   child_folder

其中 child_folder 不是一个实际的文件夹,而是一个包含如下行的简单文本文件:

Subproject commit 3ddea2d9a36dbdbf02f9f1897b713704300b0c34

.gitmodules文件包含有关 repo 的信息,允许 git 稍后从该 repo 中签出完全相同的提交,从而重建所有文件,而无需实际将它们添加到父 repo。

但是,如果您不希望这样做,因为您确实想简单地添加文件而只是这样做git add <child_folder>,您将看到以下消息:

warning: adding embedded git repository: child_folder
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint: 
hint:   git submodule add <url> child_folder
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint:   git rm --cached child_folder
hint: 
hint: See "git help submodule" for more information.

这听起来像它已经完成了我想要的,并警告你,以防你不希望发生这种情况。但实际上,它并没有添加文件。

相反,它添加了与 相同的child_folder文件git submodule add,但没有添加.gitmodules似乎是它的必要伙伴的条目,并且它建议的两个命令现在都不会实际工作,因为该命令刚刚采取了行动。

git submodule add如果上一个命令尚未向名为 git 的索引中添加一些内容,则该命令会起作用,child_folder因此该命令将失败并显示'child_folder' already exists in the index.

如果第一个命令完成了我想要的操作,我假设第二个命令将起作用,并允许您撤消该操作,但它会说

error: the following file has staged content different from both the
file and the HEAD:
    child_folder

所以似乎在某些时候,我想要发生的是默认设置,并且添加了此错误消息以帮助那些错误地执行此操作的人。现在,用一个命令似乎不可能做到这一点,而且旧的帮助信息已经过时并且没有帮助。

以前,您可以通过谨慎使用或不使用最终 / 来避免这种行为,git add child_folder/但在 git 历史上的某个时刻,在 1.6 版之前,这种解决方法似乎已经停止工作,而您现在总是得到我描述的行为。

似乎没有可以添加到命令中的标志来指定您知道子目录是一个 repo,并且您不在乎。有一个标志 --no-warn-embedded-repo的帮助说:

默认情况下,git add 会在将嵌入式存储库添加到索引时发出警告,而无需使用 git submodule add 在 .gitmodules 中创建条目。此选项将抑制警告(例如,如果您手动对子模块执行操作)。

如果您忽略“例如”之后的所有内容,那么这听起来正是我想要的。但是如果你包含了 eg 那么我不知道你为什么要手动更新 .gitmodules 中不存在的子模块。无论哪种方式,它都无济于事。它确实抑制了警告,但它采取的行动保持不变。

我目前的解决方法是在执行 git add 之前将 .git 文件夹从子仓库删除或移动到不同的位置,但似乎这应该是一个可能的选项,可以作为首选项设置或命令行标志,或者确实是现有警告消息的默认行为作为对那些不想要的人的帮助,以及对知道他们正在做的事情会引发警告并且不在乎的人的现有标志。

我是否缺少可以执行我想要的 git 命令或选项,或者这只是 git 中的错误?

标签: gitversion-controlgit-submodulesgit-add

解决方案


推荐阅读