git add . -> 新文件仍然显示 "nothing to commit"

79

我在使用Git时遇到困难,似乎无法添加我的文件。 我运行了ls命令显示这些文件在当前目录中,然后运行git add .git status命令,但是状态为“nothing to commit”。

JJ-Computer:first_app JJ$ git init

Reinitialized existing Git repository in /Users/JJ/rails_projects/first_app/.git/

JJ-Computer:first_app JJ$ ls

Diary.txt README.rdoc config.ru log   tmp
Gemfile   Rakefile  db    public    vendor
Gemfile.lock  app   doc   script
README    config    lib   test

JJ-Computer:first_app JJ$ git add .

JJ-Computer:first_app Jenn$ git status

# On branch master
nothing to commit (working directory clean)

JJ-Computer:first_app JJ$ 
16个回答

154

您的命令看起来正确(我已经以这种方式多次执行过它们)。

首先尝试

git add --all

然后尝试执行git status命令。我认为这不会解决问题,但值得尝试。

接下来检查您的.gitignore文件,如果有的话(在您执行git init的顶层目录中)。

cat .gitignore

移除导致你的文件被忽略的任何列表。例如,是否有仅包含 * 的条目?

接下来尝试:

git add --force

然后尝试git status命令。

如果以上方法都无效,我注意到你从git init的输出中看到的是"reinitialized"而不是"initialized",这意味着可能出了些问题。如果你刚刚初始化并且不介意失去历史记录,请通过删除.git目录重新开始:

rm -rf .git

然后重新执行你上面的命令。如果还不行,需要提供关于你的设置的更多信息。例如,你可能有一个全局的.gitignore文件:~/.gitignore_global需要编辑(或删除,如果你不想要它)。


2
太棒了!谢谢!我删除了.git目录,然后执行了git init和git add . - RandyMy
14
对我来说,使用"git add --all"命令有效。"."有什么问题吗?:/ - Christo S. Christov
3
这对我有用。我所做的唯一更改是 git add . --force - RaulGM
2
git add --all 对我很有用。感谢你的付出。 - Daniel L. VanDenBosch
2
我的问题是:我在一个嵌套的目录中,试图从父目录添加文件。 - testing_22
显示剩余4条评论

109

由于我多次遇到类似的问题,所以我想补充一点:请仔细检查您是否正在尝试从当前项目的根目录添加


16
这是一个好主意。经常询问的人通常不在根目录中。有趣的是,在这种情况下,楼主没有展示进入项目目录(cd)的步骤。+1 - Michael Durrant
对于初学者来说,Git 中的一个巨大的困惑源是大多数命令都在当前工作目录的上下文中执行。 - gravidThoughts
4
这应该是第一道防线,然后是@quux00的答案。 - Jacksonkr
当使用 git add --all 和 git add . 时,通常会产生不同的结果。 - Yolomep

20

如果有人遇到类似的情况,导致git无法添加文件夹的另一个原因可能是该文件夹内存在一个 .git 目录。

这种情况下,git希望您将其视为子模块。否则,只需删除该目录中的.git(而非根目录)并重试即可。

便利的命令:

find . -name '.git' -type d

5

我遇到了类似的问题,并且发现我是在主目录的子目录下执行了git add .

请确保在项目根目录下执行,或者您可以在任何子目录中使用git add --all,这样就可以了。


4

在我的情况下,我通过储藏并立即应用这个储藏来解决这个问题:

git stash
git stash apply

这个操作序列会将代码库恢复到之前的状态。之后,执行git add [file]命令就可以正常工作。

(在SUSE Linux下使用git版本1.7.12.4)


4
在我的情况下,是由于在当前git目录中嵌套了一个git目录所致:
A1.java
B1.java
.git
someDirectory
  C1.java
  .git        

cd someDirectoy
rm .git -rf

3

由于某种原因,我在Google Drive文件流目录中拥有的存储库很长一段时间以来都能够正常使用Git。昨天,我遇到了同样的问题。git add .没有报告任何要提交的内容,但是git add <some explicit filename>可以毫无问题地工作。我将该目录移动到本地硬盘(而非Google Drive文件流),git add .捕获了所有待处理更改。请注意,当该目录仍位于Google Drive文件流上时,将该目录设置为“脱机可用”无效。


1
我在 Mac OS X 上遇到了与 Git 存储库位于 Google Drive 文件流中的相同问题。卸载(“弹出”)并重新挂载文件流解决了该问题,但我认为更好的解决方案确实是将存储库完全移出文件流。 - Peter Leimbigler

3
我刚遇到了这种情况。在我的情况下,是文件(大小写)的问题。 事情是这样的——我修改了NuGet.config文件,然后Visual Studio因某种原因重新创建了这个文件,但是它的名字是NuGet.Config(注意,不是.config,而是.Config)。
我找到的最简单的解决方法是将此文件移动到另一个位置,并完全不提交此文件。 git status消息如下:
[deleted] NuGet.config
[deleted] NuGet.Config

然后我将文件复制回仓库目录并提交,一切都像一开始一样正常。

长话短说,在我的情况下,这是文件命名策略冲突。在Windows中,文件名中的大写/小写字符不重要,但对于UNIX衍生的git命令却很重要。


谢谢,我为了这个问题已经纠结了3个小时了。在我的情况下,git对Constants.pyCONSTANTS.py之间感到困惑。 - undefined

2
我找到了一个完全不同的原因,导致这种情况的出现,而且相当有些意思。 如果你不在Windows系统中,这可能不会影响你。 如果你发现你的文件在未暂存的更改中,那么.gitignore文件不会是问题所在。 请仔细检查一下,你的文件是否同时存在于已暂存和未暂存的更改中。
git status
Staged changes
  modified: source/abc.Ui.Tests
  modified: source/def.Ui.Tests/def.UI.Tests.csproj
Unstaged changes
  modified: source/abc.UI.Tests
  modified: source/def.UI.Tests/def.UI.Tests.csproj

看到区别了吗?很难发现。Windows不关心大小写,但git bash会。

git rm -r source/abc.Ui.Tests
git reset source/abc.UI.Tests
git commit -m "Fixing capitalization"
git checkout source/abc.UI.Tests
git status
     working clean tree

1
补充quux00的.gitignore答案,我发现我的目录没有被跟踪,原因是我的构建管理器(Maven)的临时“build”目录。 Maven在构建我的程序时将“build”添加到.gitignore中,因此我的自己的目录(巧合地命名为“build”)随后就没有被跟踪了。这个问题通过重命名我的“build”目录得到解决。

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