Git把文件夹当作文件处理,忽略所有子文件夹和文件。

8
我是一个有用的助手,可以翻译文本。

我在使用Git时遇到了奇怪的问题。我使用Composer将TCPDF包含在我的应用程序中,但我无法将其添加到我的存储库中。

以下是我的具体操作步骤:

enter image description here

现状是这些只是插件;缺少我需要的“tcpdf”文件夹。
现在我运行Composer以安装额外的目录。

enter image description here

在这张图片中,很明显有些问题。Composer已经下载了所有文件和文件夹,并且TCPDF在我的机器上运行,但只有tcpdf文件夹显示为红色。子文件夹没有!我进入命令行并执行“git add .”,以便添加所有文件和文件夹。现在它看起来像这样:

enter image description here

依然错误。

git status 反映了错误的状态:

enter image description here

我真的卡在这里了。我不知道如何告诉Git这不是一个文件,而是一个文件夹。我的仓库很完美,但如果我的同事更新,他只会得到这个文件,没有文件夹内容。

我该怎么办?


tcfdf文件夹中执行git add .命令时的输出是什么?那里有一个.gitignore文件吗?执行git status --ignored命令是否显示该文件夹中的文件被忽略了?如果是这样,那么您需要停止忽略它们,或使用git add -f PATHS_TO_ADD强制添加它们。 - John Szakmeister
tcpdf 可能是一个符号链接吗? - Hasturkun
在该文件夹中执行 git add . 没有任何区别,没有 .gitignore 文件,git status --ignored 命令也不显示任何文件,并且 tcpdf 不是符号链接。 - Sherlock
4个回答

14

自从你使用了复制-内容-然后-移动的解决方法,就没有简单的方法来测试这个问题,但我怀疑你的 tcpdf/ 目录包含了它自己的 .git/

Git 通过在父仓库中创建特殊的 "gitlink" 文件来处理嵌套目录。当你将 tcpdf/ 目录中的内容复制到 test 目录中时,你很容易会错过隐藏的 .git/ 目录,这意味着该目录不再是一个嵌套的仓库。

使用 Composer 时,如果你使用了 composer require --prefer-source 或类似的命令,就可能发生这种情况。如果你正在使用不稳定版本,则这是默认设置。

虽然一些开发人员喜欢跟踪 Composer 创建的 vendor/ 目录,但这是不推荐的

我应该在我的供应商目录中提交依赖项吗?

通常建议不要。应将供应商目录(或任何安装依赖项的位置)添加到.gitignore/svn:ignore/等中。

最佳做法是让所有开发人员使用Composer来安装依赖项。同样,构建服务器、CI、部署工具等都应该适应运行Composer作为其项目引导的一部分。

该页面继续解释了为什么存在这个建议。我建议阅读整个页面。如果您遵循这种最佳实践,则无论您使用--prefer-dist还是--prefer-source都没有关系。

一般来说,应该跟踪composer.jsoncomposer.lock文件


12

像往常一样,我又迟到了,但我在这里绊倒了,其他人也可能会遇到同样的问题。

当我在 git 仓库中意外地将 .git 文件夹留在子文件夹中时,我遇到了此问题(1)。

通过清除本地 git 缓存,我解决了这个问题:git rm -rf --cached .(注意末尾的句点!)

请参见 git rm -? 获取有关标志的信息。

(1) git 认为一个文件夹是单个文件


同样的问题 - 也来晚了。在没有先删除 .git 文件夹的情况下,将文件夹复制到现有的仓库中!我的解决方案就是删除子 .git 文件夹。 - Maxxx

1
你在 tcpdf 目录下拥有 git 的 submodule。为了确认这一点,你可以回到删除 tcpdf 文件之前的提交并运行 git submodule status,此外你的工作树根目录应该包含 .gitmodules。也许在你的仓库中拥有一个子模块是有益的原因。

1
我不知道出了什么问题,但我将整个tcpdf的内容复制到一个名为test的新文件夹中,成功提交了该文件夹及其内容,删除了tcpdf-'文件',提交后,将test-文件夹重命名为tcpdf并再次提交。现在一切都很好,虽然有些奇怪。

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