【问题标题】:git ignoring a directory, it's like it doesn't existgit忽略目录,就好像它不存在
【发布时间】:2012-05-25 17:41:10
【问题描述】:

我有一个克隆的仓库。有一个目录,称为 a/b/c,它曾经是它自己的 repo,即有 a/b/c/.git/ 等。

现在我想要在主仓库中管理文件。我不关心 a/b/c 中的历史,所以我删除了 a/b/c 中的 .git 目录

但问题是git status 完全忽略了 a/b/c。我不能git add它。就好像我将路径放入 .gitignore (我没有)。

显然之前,git 忽略其中包含 .git 目录的子目录是有意义的,但现在它如何知道其中的区别?

除了 .gitignore 和 .git/info/excludes 之外,是否还有其他地方列出了忽略文件? .git/config 文件里什么都没有?

有人问我 git status 说什么。不多:

/path/to/root/dir $ git status
# On branch fred
nothing to commit (working directory clean)

以及 git add 所说的。甚至更少(无)

/path/to/root/dir $ git add a/b/c

【问题讨论】:

  • 你检查上级目录下的.gitignore文件了吗?
  • 是的,里面没有任何东西可以匹配路径。
  • git add 收到的信息是什么? git status 到底显示了什么?
  • 它是一个子模块吗? stackoverflow.com/questions/1260748/…
  • 只是为了清楚该目录中有文件吗?

标签: git


【解决方案1】:

我刚才出现这个问题是因为我使用create-react-app在git控制的顶级文件夹todo中初始化了一个client应用程序:

cd todo
npx create-react-app client --template typescript

在后台创建了一个文件夹client,其中包含一个.git 目录和一个.gitignore 文件。这就像一个 git 子项目。

当我通过git add -i 将项目添加到源代码管理时,创建了一个奇怪的空目录指针,但没有内容。

我使用了命令

git rm --cached client

...它删除了 git 存储的奇怪的空目录/指针。但是当我尝试添加文件夹时,我收到了这条消息:

~/depot/todo $ git add client
warning: adding embedded git repository: client
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> client
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint:   git rm --cached client
hint: 
hint: See "git help submodule" for more information.

为了解决这个问题,我删除了 git 工件,然后我可以正常提交。

rm -Rf client/.git
rm -f client/.gitignore
git add client
git commit -m "Add missing client content"

【讨论】:

    【解决方案2】:

    我不知道问题是什么或它是如何产生的(v. 烦人),但这是我修复它的方法,以防其他人被卡住:

    git rm --cached a/b/c
    git commit -m "removed phantom a/b/c dir"
    git add a/b/c
    git commit -m "finally able to add a/b/c"
    

    有趣的是git log a/b/c 只列出了“终于能够...”提交。 git show HEAD^(“已移除的幻影......”提交说

    -Subproject commit c311ccdc91c8be66019aa138d1c4af49a6b7a81c
    

    所以看起来它正在以某种方式特别对待它。我将不得不阅读有关子项目和/或子模块的更多信息。

    【讨论】:

    • 听起来索引中有/曾经有一些东西,独立于超级项目中任何丢失的 .gitmodules 文件,认为该目录是一个跟踪的子模块。找出原因会很有用。
    • 在上层仓库中检查 .gitmodules。该文件应列出该 repo 认为它拥有的所有子模块(包括您删除的那个 ;-)
    • 感谢您报告此事。刚刚遇到了同样的问题。
    • 你是救生员。谢谢。
    • 这也发生在我身上。它发生在我从子目录而不是 repo 的顶层执行 git add 之后。我不确定这是否相关。你的修复工作。谢谢。
    【解决方案3】:

    使用git add -f 强制 git 添加它当前忽略的文件。

    【讨论】:

    • 这将添加所有被忽略的文件夹,包括 vendor/,大多数人可能不想这样做。就我而言,它也没有解决与 OP 相同的问题
    • 这不会永久添加文件,问题会在下一个分支再次出现。
    【解决方案4】:

    你有一个全局 gitignore 文件吗? (检查git config core.excludesfile)

    【讨论】:

    • 我的机器上不存在这个文件。
    【解决方案5】:

    总结:您的 .gitignore 文件(包括目录本身中的任何文件)是否忽略了目录包含的所有内容。如果是这样,Git 会将其视为空而不列出)

    我遇到了类似的问题。我发现被忽略的目录包含一个 .gitignore 文件(虽然不是 .git 目录)。删除它后,git 突然再次对它感兴趣,并将其列为 git status 中未跟踪的文件/目录。

    当我将 .gitignore 的原始内容从之前的终端中粘贴回来时,git 再次没有看到或将目录列为未跟踪。

    通过反复试验,我发现我可以从 .gitignore 中删除所有内容除了以下条目:

    .factorypath
    .springBeans
    

    如果 这两行 都在 .gitignore 文件中,则 git 看不到包含目录(不是 git 存储库的根目录)。

    这给我带来的问题比它回答的要多。

    这是目录列表,但我看不到模式。

    total 72
    drwxr-xr-x@ 10 stephen  staff    320 30 Aug 19:04 .
    drwxr-xr-x  17 stephen  staff    544 30 Aug 18:59 ..
    drwxr-xr-x   2 stephen  staff     64 25 Jun 15:00 .apt_generated
    -rw-r--r--   1 stephen  staff   1341 25 Jun 15:00 .classpath
    -rw-r--r--   1 stephen  staff  18665 28 Jun 10:44 .factorypath
    -rw-r--r--@  1 stephen  staff     25 30 Aug 19:12 .gitignore
    -rw-r--r--   1 stephen  staff   1094 28 Jun 10:44 .project
    drwxr-xr-x   7 stephen  staff    224 25 Jun 15:00 .settings
    -rw-r--r--   1 stephen  staff    479 28 Jun 15:43 .springBeans
    drwxr-xr-x   6 stephen  staff    192  2 Jul 12:41 target
    

    【讨论】:

    • 好吧,我很快就发现了至少对我的表现形式的可​​能答案。目录中的 .gitignore 文件正在添加要忽略的节点,因此目录中的所有内容都被忽略(其他节点被其他更高的 .gitignore 文件忽略)。因此,列出的内容没有什么特别之处,只是它们有助于忽略目录中的所有内容,并且由于 Git 对空目录的态度,它不再列出它。
    【解决方案6】:

    看来空目录对于Git来说基本上是不存在的。如果目录中的所有文件都匹配 .gitignore 模式,那么 git 会将目录视为空。

    我在一个带有 foo.tgz 文件的目录上发生了这种情况,并且在 repo 的根目录下,.gitignore 文件具有 *.tgz 模式。非常令人沮丧的是,“git check-ignore”命令没有报告“嘿,菜鸟,我的目录看起来是空的”之类的东西。

    下次试试这个:

    git check-ignore strangely-ignored-directory/*
    

    这个输出可能会解开这个谜。

    【讨论】:

    • 这有帮助。它说该目录被标记为子模块。运行git rm --cached strangely-ignored-directory(没有尾部斜杠)修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2012-06-30
    • 2011-08-12
    相关资源
    最近更新 更多