Git不会添加修改过的文件。

29

不知道为什么会发生这种情况:

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:   file (modified content)

no changes added to commit (use "git add" and/or "git commit -a")
starkers@ubuntu:~/Documents/currentWork/protection_demo$ git add --all
starkers@ubuntu:~/Documents/currentWork/protection_demo$ 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:   file (modified content)

无论我怎么做,git commit -amgit commit -a,文件都不会被添加到提交中。有什么帮助吗?


3
请用以下方式翻译:将“file”替换为涉及文件的完整路径。另外,你是否在使用子模块? - jub0bs
1
你的 .gitignore 文件中是否包含该文件? - chooban
但你不需要使用--force选项吗? - chooban
@chooban 不需要,如果涉及的文件已经被跟踪。这里所涉及的文件被列为“修改”,这表明它是一个被跟踪的文件。 - jub0bs
当然!这会教训我,不应该在午夜后尝试回答问题。 - chooban
显示剩余4条评论
15个回答

22

我认为Jubobs的评论可能是正确的。你的“文件”是一个子模块吗?

这一行(提交或放弃子模块中未跟踪或修改的内容)不应该出现在普通文件中。

这是我从git状态中得到的:

$ 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)

        modified:   README.txt

no changes added to commit (use "git add" and/or "git commit -a")

在我的README.txt中,您将看不到(提交或放弃子模块中未跟踪或修改的内容)(修改的内容),因此您可能需要按照git建议的方式在子模块中处理内容。

编辑:先前我认为“git add .”可以解决这个问题,但现在我不这么认为了。


4
--allgit-add 的一个有效选项。根据 git-add 手册,*--all 不仅更新工作树中与 <pathspec> 匹配的文件的索引,还更新已经有条目的索引。它会添加、修改和删除索引条目,以使其与工作树匹配。* - jub0bs
哦,是的,你说得对!我总是使用 "git add ."。我想现在我应该使用这个选项。 - palazzo train
2
在我的情况下,我的子文件夹中有一个隐藏的.git文件夹。所以我删除了它,问题就解决了。 - λraulain

15

我曾经遇到过同样的问题。我的个人"灵光一现"是,我之前在子文件夹中添加了一个跟踪.git存储库文件,因此它被视为子模块。在删除子文件夹中的.git后,它愉快地加入了我的其余文件夹,成为根文件夹中的一个.git文件的一部分。我甚至不知道有关子模块的事情,也许这会帮助其他人。


2
我删除了误创建的.git文件夹,状态得到了修复。在我的情况下,我不得不重命名文件夹/文件,然后推送到远程。就像一个解决方法。 - Tim
1
我也遇到了同样的问题。不知何故,当我从子文件夹中删除了.git后,它完全停止了跟踪,就好像它不存在一样。因此,我也删除了父级的.git,并重新进行了初始提交,因为那是它所有的历史记录。 - Nagev

8

我曾经遇到过同样的问题,不知道为什么一个.h文件无法提交。

所以,我将它重命名,这就删除了原始文件并创建了一个新的文件让git感到满意。然后我提交了这些更改。Git很高兴。

然后我只是将它重新命名回来。再次提交时,Git也很高兴。

无法解释为什么会发生这种情况,但至少它被修复了。


对我来说,路径有问题。我有两个不同的路径指向同一个文件MyDomain.Service/Folder/Folder/MyFile.cs和mydomain.service/Folder/Folder/MyFile.cs(注意大小写的区别)。当我从文件资源管理器中删除该文件并添加一个具有相同代码的新文件时,它就可以工作了。谢谢! - Joel Wiklund
我认为我也遇到了这个问题。 我在Windows上遇到了此问题。 任何现有的解决方案都没有指出我的错误。 我将文件重命名,暂存,然后将其重命名回其先前的文件名,暂存,所有问题都得到解决。 - Ryanman

6

不确定这是否相关,但在Linux和Windows之间切换时,我遇到了相同的问题。我有两个文件,一个是WEB.config,另一个是web.config。由于Windows不区分大小写,它似乎感到困惑了。我将文件重命名提交,然后重新命名并再次提交,似乎解决了问题。


同样适用于Mac OS。 - Gordon Freeman

4
您可以通过以下三种方式添加文件:
  • 如果您想添加单个文件,请使用git add 文件名及路径

  • 如果您想添加多个文件,请使用git add .

  • 同时,您可以通过此命令添加所有文件并编写提交说明:git commit -a -m '您的提交信息'


1
或者简写为 git commit -am '你的提交信息' - csvan

3

我遇到过类似的情况。无论我做了什么,文件都会出现修改的状态。查看差异时,发现文件已经被更改成我之前提交的版本。即使第一次提交后,文件看起来总是处于修改状态。最终,我删除了该文件,提交了删除操作,这看起来像是我删除了两个文件。然后再次添加了该文件。这是我从未见过的非常奇怪的事情。


我也遇到了同样的问题。在我的情况下,文件最近被重命名了,我不知道发生了什么,但是删除并重新创建(中间没有提交)使其可以被添加。 - tris timb
完全相同的事情 - Martin De Simone

3

大家好!也许这能帮到某些人。在我的情况下,Git 没有添加和提交文件,因为我试图从深度嵌套的文件夹中添加和提交,而这些文件夹不包含 git 文件。当我回到根文件夹时,它很容易地添加和提交了。


这是一个被忽视的解决方案,特别是在Windows中。我刚刚从我的深度嵌套的当前位置上升了一个级别,它起作用了。不知道这是否与Windows或Git中的长文件名限制有关?也就是说,我的当前位置的整个路径加上其他深度嵌套文件的整个路径超过了限制?(我已经在Windows和Git中启用了长文件名支持,但是...也许?) - Neman

1
所以,如果你遇到 "(commit or discard the untracked or modified content in submodules)",这意味着你的子文件夹中有内部仓库即 ".git" 文件,并且最近对文件的更改没有被注册到这些内部仓库中。
一种方法是更新内部仓库,即在内部仓库中添加和提交所有更改。
或者放弃内部仓库。

1
我遇到了同样的错误:

fatal: Cannot update paths and switch to branch 'develop' at the same time.

然后使用 git status 命令:
$ git status
warning: LF will be replaced by CRLF in .gitmodules.
The file will have its original line endings in your working directory.
On branch develop
Your branch is up-to-date with 'origin/develop'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitmodules
        new file:   submodule_dir

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:   submodule_dir (modified content)

并且 git diff 显示:

$ git diff
diff --git a/somedir b/somedir
--- a/somedir
+++ b/somedir
@@ -1 +1 @@
-Subproject commit some-commit-hash
+Subproject commit some-commit-hash-dirty

问题在于我试图添加一个子模块仓库中还不存在的分支。

0

昨天我也遇到了这个问题,我的情况是因为我试图从项目的子目录中调用git。然后我使用了"git add --all"命令解决了问题,同时我也进入了正确的目录,这样也可以解决问题。

但我不明白的是:为什么git status和git --all命令在任何情况下都可以从子目录中工作呢? .-.

希望这能帮到你 =)


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