git add -A命令并没有将所有修改过的文件添加到目录中

62
我想添加所有的文件,无论是删除的、创建的、修改的、未被跟踪的等等状态都要包含在内。但我不希望每次都执行 git add ALL 命令。我尝试了使用 git add -A 命令,但它没有添加文件夹中修改后的文件。
下面是我的项目初始状态:git status
Rakib-MacBook-Pro:my-xcode-practice rakib$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   BankAccount (modified content, untracked content)
#   modified:   BuckysButtons (modified content, untracked content)
#   modified:   multiview (modified content, untracked content)
#   modified:   rotator (modified content, untracked content)
#   modified:   segmentedControls (modified content, untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

然后我执行了 git add -A 命令:

Rakib-MacBook-Pro:my-xcode-practice rakib$ git add -A

然后这里是执行 git add -A 之后 的新状态:

Rakib-MacBook-Pro:my-xcode-practice rakib$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   BankAccount (modified content, untracked content)
#   modified:   BuckysButtons (modified content, untracked content)
#   modified:   multiview (modified content, untracked content)
#   modified:   rotator (modified content, untracked content)
#   modified:   segmentedControls (modified content, untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

你可以看到在git status中没有任何变化。我该怎么解决?

我也尝试过git add .,但这并没有帮助。

我还尝试过git add *,但这也没有帮助。


你能检查一下 git add .; git add -u 吗?解释请参考:https://dev59.com/lHRB5IYBdhLWcg3wn4UL - Marcin Gil
@DipSwitch 我尝试过 'git commit -a -m' 和普通的'commit',但没有成功。 - Rakib
@DipSwitch 我没有将任何东西添加到忽略列表中。 - Rakib
@MarcinGil 我已经尝试过 git add . - 我已经尝试过 git add -u - 我得到了相同的结果。 - Rakib
@Dan Cruz:我认为我们已经在下面确认了这一点 - git status 中的输出 (modified content, untracked content) 仅适用于子模块或嵌套存储库,并且 syedrakib 在评论中引用的错误告诉我们它是后者。 (即.gitmodules至少缺失,以及可能缺少submodule.[SUBMODULE-PATH].url配置选项。) - Mark Longair
显示剩余7条评论
9个回答

48

这里的问题在于BankAccountBuckysButtonsmultiviewrotatorsegmentedControls都是Git子模块,它们在许多方面都像独立的存储库。

如果你想要做的是在每个子模块中运行git add -A .,你可以这样做:

git submodule foreach --recursive git add -A .

然后你可以使用以下命令在每个子模块中创建一个提交:

git submodule foreach --recursive "git commit -m 'Committing in a submodule'"

(如果你的子模块内没有其他子模块,则 --recursive 选项是不必要的。)

然而,我不建议这样做。你应该仔细进入每个子模块,考虑如何更新它们,将每个子模块视为独立的仓库。只有在测试了整个项目与每个子模块的新版本兼容之后,才将这些新的子模块版本提交到主项目中。


更新: 从你在下面评论中引用的错误消息来看,似乎你已经直接添加了这些其他的git仓库,而不是作为子模块添加。 如果你真的想将它们存储为子模块,我建议你把它们移出你的仓库,提交它们的删除,然后使用 git submodule add <REPOSITORY-URL> 正确地将它们作为子模块添加。


1
在这种情况下,这些存储库并没有被添加为子模块,而是直接添加了它们。我已经更新了我的答案以反映这一点。 - Mark Longair
1
这是标准的做法,是的 - 大多数人可能不知道您可以将其他存储库作为树中的条目添加而不使用 git submodule 命令。但是,这并不意味着这一定是适合您的正确方法 - 您可能需要查看 git slavegit subtreerepo 作为可能的替代方案。或者完全避免嵌套存储库可能更好。 - Mark Longair
嘿@MarkLongair,非常感谢您的更新。它完全解决了我的问题。我的问题是因为我将其他项目文件夹(其中包含.git文件夹)复制粘贴到我的存储库中而引起的。那就是问题的根源。 - Rakib
同意你的答案,但是你的更新让我感到困惑。you have added these other git repositories directly rather than as submodules 让我相信有一种方法可以通过将另一个仓库直接添加而不是作为子模块来生成 OP 的输出 (# No submodule mapping found in .gitmodules for path ...)。我是否遗漏了什么或者除了删除 .gitmodules 文件之外还有其他方法可以获得这个输出?将另一个仓库复制为子目录,在其中进行修改并运行 git status 并不能产生相同的输出。 - Go Dan
1
@MarkLongair:你说得对,不同的版本会产生不同的输出。按照你的方法尝试了一下,在版本1.7.0.4和1.7.4.1(来源码构建)上使用了 git status 命令,结果得到了不同的输出。1.7.4.1 版本的输出涉及子模块,而 1.7.0.4 版本则没有。又学到了新知识。 - Go Dan
显示剩余4条评论

31

我是无意中重建了这个项目。

我将另一个文件夹中的项目复制到我的新 git 存储库中。我原本不打算将其用作子模块,而是打算将其用作新项目的起点。我复制的项目现在是我的主要 git 存储库的子文件夹,并且其中包含 .git/ 文件夹。请删除 subfolder/.git/

rm -rf subfolder/.git

那时情况还是很奇怪的...

git status

没有要提交的内容。嗯...那这些文件怎么办?

原因是这些文件仍然作为子模块被缓存在git中 - 需要清除该缓存:

git rm --cached subfolder

现在您应该看到git status中子文件夹中的所有文件。

现在可以提交和推送。

git add -A
git commit -m 'fix: rm accidental submodule and readd files'
git push origin <branch>

3
回想起来,好像我当时不知道自己在做什么,哈哈——采取了蛮力方法。 - Patrick Lee Scott
非常感谢!将内容复制到新文件夹并删除旧的子模块有所帮助! - Chaitanya Bapat
1
2020年更新!解决这个问题的实际方法... :) - Patrick Lee Scott

5

对我来说,这是一个相当简单的解决方法 - 我在项目的子目录中打开了Git Bash。

在根目录中打开Bash并执行命令可以解决这个问题;git add -A .将按预期工作。


1
谢谢!我很惊讶 git 没有告诉我这个目录不是一个仓库! - Dave

4

我解决了这个问题,方法是删除预期子模块内和项目根目录中的 .git 文件夹,然后执行新的 'git init' 命令。


2

这个错误是因为您添加了一个已经链接到其他GitHub存储库的文件夹。

要解决此问题,请首先从BankAccount文件夹中复制要上传到GitHub的文件,然后删除BankAccount文件夹。

现在创建一个新文件夹,然后将文件粘贴到其中。

这是由于早期文件夹中存在Git自动获取的git子模块所致。

现在您可以执行

git add . 
git status

1
我在Windows上遇到了类似的问题,使用git add --all命令后,一些文件未被跟踪。问题在于有几个文件大小写不同,如'test.php'和'Test.php',因此git跟踪了'Test.php'而不是其小写版本。
这可能对未来的某个人有所帮助,并节省一些头疼的时间。

0

让我们引用-A的文档:

       -A, --all
       Like -u, but match <filepattern> against files in the working tree in addition to the
       index. That means that it will find new files as well as staging modified content and
       removing files that are no longer in the working tree.

请注意关键词:<filepattern>。您需要提供一个可以递归地匹配整个树的模式。

我也尝试过 'git add *' - 那应该是通用模式,对吧?但它也没有起作用。 - Rakib
*始终表示“在当前目录中”。不幸的是,由于kernel.org大部分时间都处于离线状态,我无法为您找到filepattern的定义。 - bmargulies

0
我遇到了这个问题,因为我将别人的代码库克隆到我的项目中。当我克隆时,他们的项目中已经有了.git和.gitignore文件夹/文件。在删除这些预先存在的git文件并重新开始使用git后,它就可以正常工作了。

0

最近在使用BitBucket时遇到了这个问题。 我正在一个由Visual Studio 2013 Community Edition跟踪其存储库的项目上工作。

然而,我有时候会使用Git Bash手动提交,这就是问题开始出现的时候,文件被简单地忽略了。尝试重新克隆存储库,但这并没有帮助。

最后我发现如果你进入Visual Studio>团队资源管理器>点击同步,Visual Studio将执行拉取操作,然后提交和推送任何未被跟踪的文件。

如果您像我一样喜欢控制台,可以通过Git Bash手动进行相同的操作。

希望这能帮助到有需要的人。


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