非常奇怪,突然间,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 diff
s:
首先,
git status
将HEAD
提交与索引进行比较。无论有什么不同,Git告诉你是一个"需要承诺的改变"(我想是"qui seront validées")。无论是什么,Git都没有提及。然后,
git status
将索引与工作树进行比较。无论有什么不同,Git告诉你是一个至少不相关的改变。当然,您可以将更新后的文件git add
放入索引中;之后,第一个比较,HEAD
与索引,将显示不同的内容。不在索引中但在工作树中的文件被称为未跟踪("non-suitvis")。即使文件处于
HEAD
提交中,也是如此。(但是,请注意,您可以通过在.gitignore
中列出文件或其模式来抑制对未跟踪文件的抱怨。)
结论:文件在HEAD
和工作树中,但不在索引中
您所显示的输出正是本例所期望的结果。该文件在HEAD
中,但不在索引中:除非您将其放回索引,否则它将在下一次提交时丢失。文件不在索引中,而是在工作树中:它未被跟踪。