无法将文件添加到 git,严重

Can't add a file to git, seriously

已解决,如已接受答案下的评论中所述。

多年来我一直在使用 Git,我真的很惊讶我有一个特定的文件无法添加到我的一个回购中的暂存区!我不想删除并重新创建回购协议,而是了解发生了什么并修复它。此外,现在我担心可能还有其他文件未添加 到存储库(或其他存储库)。

我有一个 repo,其中我刚刚提交并成功推送了一堆文件,然后我意识到其中一个 init.el 没有上传。 这是我的:

然后我尝试删除文件 rm init.el,这正确地导致

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   .gitignore

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    deleted:    init.el

然后,我尝试做 git rm init.el,这又正确地导致了

rm 'init.el'

但是放回文件然后用 git add init.el 添加文件显示没有输出,并且暂存区中仍然缺少该文件(我已经用 git status、[=25 检查过这个=] 并通过提交和推送(见下一行))。 尝试提交、推送并仔细检查 Github 中发生的事情,确认文件尚未添加。

你永远不会停止学习,是否有任何我不知道的标准可能会触发此行为,或者这是一个错误,那么有什么方法可以修复回购协议吗?

编辑,回复一条评论

.DS_Store
spacemacs_d_backup2020/
./spacemacs_d_backup2020/.gitignore
./.gitignore
.DS_Store

我们来谈谈 git 跟它说话时说的话。首先,这是一个包含一些文件的文件夹:

$ ls
a.txt   b.txt

现在我会尝试将a.txt添加到暂存区:

$ git add a.txt
$ 

嗯,git没说什么。就像您报告的那样:

Running git add init.el does not produce any output

该死。为什么不添加呢?好的,让我们试试别的:

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file:   b.txt

嗯,它没有列出 a.txt。我越来越担心了!好的,让我们换个方式试试:

$ git diff --cached
diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+hello

嗯,又没提到a.txt。就像您报告的那样:

the file is still missing from the staging area (I have checked this with git status, git diff --cached

你还说:

The file (or a pattern matching it) does not appear when I run git ls-files --others -i --exclude-standard

好的,我也试试:

$ git ls-files --others -i --exclude-standard
$

没有!天哪,这太可怕了。为什么 a.txt 没有被添加到暂存区?

因为它已经在暂存区。这里的问题不是 a.txt 不在暂存区;而是这是对暂存区的误解——可能是 git 本身。

这里有一点要记住:

  • 每次提交都包含 所有 个文件。

  • 默认情况下,每个 new 提交都包含与 previous 提交相同的文件。 (唯一的区别是您更改了文件。)

  • 默认情况下,暂存区包含上次提交的所有文件

  • 当你问 git statusgit diff 这样的问题时,git 只会告诉你什么 是新的和不同的 .它不报告 存在 .

这就解释了这个谜团。在这一切开始之前,我已经添加并提交了a.txt。所以它在暂存区已经并且在上次提交中已经

所以当我说 git add a.txt 时,git 对自己说:“是的,好吧,a.txt 已经在暂存区,而且它没有改变,所以什么都没有新来的,继续前进,伙计们,继续前进”——它没有回复。

而当我说 git diff --cached 时,git 没有提到 a.txt 因为 diff 表示“差异”,暂存区中的 a.txt 与上次提交中的 a.txt 没有区别。

但是 none 这意味着 a.txt 不在最后一次提交中或者它是不在停靠区。相反,意思恰恰相反。这意味着在这两个地方

现在让我们谈谈 列表

假设我们想知道暂存区中有哪些文件。这就是 git ls-files 的用途,简单明了:

$ git ls-files
a.txt
b.txt

看,就是它! a.txt毕竟有啊!好的,假设我们想知道最近提交的内容。请记住,除了我们每次可能执行的任何 changes 之外,最近一次提交中的内容也是上一次提交中的内容,以及之前的提交和之前的提交。默认情况下,每个 提交包含所有 个文件。所以如果 a.txtever 被提交,看看它是否在 latest 提交。以下是如何做到这一点:

$ git ls-tree --name-only HEAD
a.txt

又来了!

所以你看,a.txt毕竟不是添加失败。只是我不明白 git 在告诉我什么。

最后你也说

Trying to commit, push and double check what is going on in Github confirms that the file has not been added

好吧,我无法解释那个。但是我不能越过你的肩膀看看你在 GitHub 上做什么——而且 GitHub 很难使用。也许问题只是不知道如何看待。如果你在本地的一个分支上提交并推送,然后你去 GitHub 寻找一个文件,你可能找不到它,因为 GitHub 默认不显示分支你在工作;它显示 master(或 main)。

所以这是我对发生的事情的猜测:你在本地的一个分支上,你已经 added-and-committed init.el, 可能相当长一段时间了以前,从那时起你就没有改变过它。正如我认为我已经证明的那样,这将解释您在问题中描述的现象。