代码之家  ›  专栏  ›  技术社区  ›  beesleep

git在我的repo中显示一堆文件为已删除,但它们不是

git
  •  0
  • beesleep  · 技术社区  · 7 年前

    很奇怪,突然,git将我的repo中的大部分文件显示为已删除。 ls 给他们看, tree 给他们看,我可以打开。

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

    你知道这是怎么发生的,怎么解决?

    编辑:我通过只复制 .git 文件夹到另一个目录, git status 此repo,然后再次将所有文件复制到新文件夹。过了一会儿,它会将文件重新显示为已删除…

    edit2:为了解决这个问题,在保留所有文件的副本的同时,我硬着头皮休息,然后将备份的文件重新复制到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 显示上面列出的所有已删除文件

    1 回复  |  直到 7 年前
        1
  •  2
  •   torek    7 年前

    “要提交”的更改是存储在 指数 (阿卡 中转区 阿卡 隐藏物 )git进行新的提交 索引里有什么 马上 ,所以对索引的一个很好的描述是 你打算做什么 .

    如果您复制了存储库,但没有复制索引(或以某种方式复制了索引,但没有保留所有索引),这将解释问题。索引既不是存储库本身,也不是工作树。相反,指数 之间 存储库和工作树。因此,文件可以在那里,在工作树中,按顺序排列,但在索引中丢失,git将告诉您,如果现在提交,删除将被提交。

    你可以告诉git重新填写索引 当前提交,使用 git reset --mixed . 或者,可以使用 git add . 即:

    • Git重置--混合 :从复制(所有文件) HEAD 索引
    • git add file :复制(指定的 file )从工作树到索引

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

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

    • 每个文件的索引副本仅为git,就像 复制,除了它是读/写的:它已经 解冻 . 这个 下一个 提交将通过冻结索引副本来使用该索引副本(一旦冻结所有文件并完成提交,则该索引副本 变成 这个 复制是因为 对新提交的更改)。

    • 每个文件的工作树副本都是一个普通的文件,其格式是普通的。Git没有 使用 它做出承诺。吉特不太在乎 关于 它,真的;git只是为 使用,合作,如果你愿意的话可能会改变。

    一旦你 改变 一个文件,你用 Git添加 将其复制回索引,覆盖旧的索引副本。这个 add process压缩并git验证文件,以便可以提交它。

    这个 git commit 命令获取索引中的任何内容 马上 并将其冻结为新的提交。新的提交将成为 承诺。

    当你第一次跑步时 git checkout branch ,git从tip commit填充索引和工作树 branch . 承诺变成 承诺,和 和索引匹配。当你做一个 新的 提交,新的提交将成为当前分支的尖端,并且 和索引匹配。请注意,工作树仅仅是一个 输出 最初的结帐,不是 输入 新的承诺。(或者更确切地说,其中的一些文件被放入 指数 如果你 Git添加 -编辑了一些或所有文件。)

    通常,您可以使用 git rm :

    • git rm file 删除 文件 二者都 索引 工作树;或
    • 移除文件 文件 删除 文件 从索引中删除,但将其单独留在工作树中。

    不管怎样,搬走之后,比如说, file.ext 从索引上看,你还保留着它 ,所以您有以下两个结果之一:

       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状态 git diff S:

    • 第一, Git状态 比较 提交到索引。不管有什么不同,git告诉你的是一个“需要承诺的改变”(“我猜是qui seront valides”)。不管是什么 相同的 ,吉特什么也没说。

    • 然后, Git状态 将索引与工作树进行比较。不管有什么不同,git告诉您,这是一个至少尚未承诺的变化。你可以 Git添加 当然,更新后的文件进入索引;之后,第一次比较, vs索引,会显示出一些不同的东西。

    • 一个不在索引中但在工作树中的文件被称为 未追踪 (“非瑞士人”)。即使文件在 承诺。(但是,请注意,您可以通过在 .gitignore )

    结论:档案在 以及工作树,但不在索引中

    你展示的结果正是这个案例的预期结果。文件在 但不在索引中:它将从 下一个 提交,除非你把它放回索引中。文件不在索引中,而是在工作树中:它是未跟踪的。