Git显示我的repo中有一堆文件已删除,但它们不是



非常奇怪,突然间,git将我的repo中的大多数文件显示为已删除。ls显示它们,tree显示它们,我可以打开它们。

我试图将存储库复制到另一个文件夹,git状态显示相同。。。

你知道这是怎么发生的,以及如何解决这个问题吗?

编辑:我只将.git文件夹复制到另一个目录,git status这个repo,然后再次将所有文件复制到新文件夹,从而解决了临时问题。然后过一段时间,它会将文件重新显示为已删除。。。

编辑2:为了解决这个问题,在保留所有文件的副本的同时,我努力休息,然后将备份的文件重新复制到repo。现在一切都好了。

EDIT3(更多信息):我保留了一份破损的回购文件夹的副本,以备不时之需。我让这个问题公开了,因为我仍然想知道这是怎么发生的!

>> cat $(find . -name .gitignore)
git
*.pyc
*.lprof
*.cprof
profile.sh
/doc/
/.idea/
__pycache__
/tmp/

(对不起,法语,我已经尽力翻译了)。很多文件,只是显示了一些的例子

>> git status
Sur la branche master (on the branch master)
...
Modifications qui seront validées : (modification that will be validated)
(utilisez "git reset HEAD <fichier>..." pour désindexer)
(supprimé = deleted)
supprimé :        GUI/MainWindows.py
supprimé :        GUI/PathParameters.py
supprimé :        GUI/parameter_utils.py
supprimé :        GUI/ui/ui_DefaultPathDialog.py
supprimé :        GUI/ui/ui_mainGUI.py
supprimé :        examples/__init__.py
supprimé :        externals/__init__.py
supprimé :        main.py
supprimé :        tools/searchUtils.py
supprimé :        tools/spatial.py
supprimé :        tools/utils.py
supprimé :        tools/yaml.py
....
Modifications qui ne seront pas validées : (modification that won't' be validated)
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
(modifié = modified)
modifié :         GUI/ui/ui_mainGUI.ui
modifié :         requirements.txt
Fichiers non suivis: (files not followed)
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
GUI/MainWindows.py
GUI/base/
GUI/parameter_utils.py
GUI/ui/ui_DefaultPathDialog.py
GUI/ui/ui_mainGUI.py
examples/
externals/
main.py
tools/

git diff --cached显示了以下内容,源代码为红色。它很长,我不会把源代码放在这里。如果你不想了解更多细节,就去问吧!

>>git diff --cached
diff --git a/GUI/MainWindows.py b/GUI/MainWindows.py
deleted file mode 100644
index c9ef7ac..0000000
--- a/GUI/MainWindows.py
+++ /dev/null

正如我所解释的,ls显示了上面列出的所有已删除的文件

"要提交"的更改是存储在索引(又名暂存区又名cache)中的更改。Git从中生成新的提交,无论现在索引中有什么,所以对索引的一个很好的描述是,它正是你提议提交的

如果您复制了存储库,但没有复制索引(或者以某种方式复制了它,但没有保留所有索引),这将解释问题。索引既不是存储库本身,也不是工作树。相反,索引位于存储库和工作树之间。因此,文件可以按良好的顺序存在于工作树中,但在索引中丢失,Git会告诉您,如果您现在提交,将提交删除。

您可以告诉Git使用git reset --mixed从当前提交的重新填充索引。或者,您可以使用git add写入指定的(或所有)工作树文件。即:

  • git reset --mixed:将(所有文件)从HEAD复制到索引
  • git addfile:从工作树复制(指定的file)到索引

如果您将索引视为位于HEAD提交和工作树之间,则这一切都更有意义:

HEAD           index         work-tree
----------      ----------      ----------
README.txt      README.txt      README.txt
file.ext        file.ext        file.ext
main.py         main.py         main.py
  • 每个文件的HEAD副本都是只读的:任何提交都不能更改,它是一个已提交的副本。这些文件是经过压缩的——可能是高度压缩的——并且是一种特殊的、仅限Git的格式。

  • 每个文件的索引副本仅为Git,与HEAD副本一样,只是它是读/写的:它已被解冻下一次提交将通过冻结索引副本来使用索引副本(一旦所有文件都被冻结并提交完成,该索引副本将成为HEAD副本,因为HEAD更改为新提交)。

  • 每个文件的工作树副本都是一个正常形式的正常文件。Git不使用来进行提交。Git并不太关心它,真的;Git只是为提供它,供使用、使用,如果您愿意,还可以更改。

更改文件后,使用git add将其复制回索引,覆盖旧的索引副本。add进程对文件进行压缩和Git初始化,以便可以提交该文件。

git commit命令立即获取索引中的任何内容,并将其冻结到新的提交中。新的提交变为HEAD提交。

当您第一次运行git checkoutbranch时,Git会从branch的提示提交中填充索引和工作树。该提交变为HEAD提交,并且HEAD和索引匹配。当您进行提交时,该新提交将成为当前分支的顶端,并且HEAD和索引匹配。请注意,工作树只是初始签出的输出,而不是新提交的输入。(如果您git add编辑了部分或全部文件,则它或其中的一些文件被放入索引。)

通常,您会使用git rm:从索引中删除文件

  • git rmfile中删除file,同时索引工作树;或
  • git rmfile从索引中删除file,但将其单独保留在工作树中

无论哪种方式,在从索引中删除file.ext之后,它仍然存在于HEAD中,因此您有以下两个结果之一:

HEAD           index         work-tree
----------      ----------      ----------
README.txt      README.txt      README.txt
file.ext                        file.ext
main.py         main.py         main.py

或:

HEAD           index         work-tree
----------      ----------      ----------
README.txt      README.txt      README.txt
file.ext
main.py         main.py         main.py

查看工作树不会告诉您文件已从索引中删除,它只会告诉您文件是否已从工作树删除。但git status会告诉你,因为git status运行两个git diffs:

  • 首先,git statusHEAD提交与索引进行比较。无论有什么不同,Git告诉你是一个"需要承诺的改变"(我想是"qui seront validées")。无论是什么,Git都没有提及。

  • 然后,git status将索引与工作树进行比较。无论有什么不同,Git告诉你是一个至少不相关的改变。当然,您可以将更新后的文件git add放入索引中;之后,第一个比较,HEAD与索引,将显示不同的内容。

  • 不在索引中但在工作树中的文件被称为未跟踪("non-suitvis")。即使文件处于HEAD提交中,也是如此。(但是,请注意,您可以通过在.gitignore中列出文件或其模式来抑制对未跟踪文件的抱怨。)

结论:文件在HEAD和工作树中,但不在索引中

您所显示的输出正是本例所期望的结果。该文件在HEAD中,但不在索引中:除非您将其放回索引,否则它将在下一次提交时丢失。文件不在索引中,而是在工作树中:它未被跟踪。

最新更新