git
› Pro Git
› Atlassian Git Tutorial
› Pro Git 简体中文翻译
› GitX
ddllzz
V2EX  ›  git

Git 提交时莫名其妙删除文件

  •  
  •   ddllzz · Dec 24, 2021 · 6949 views
    This topic created in 1775 days ago, the information mentioned may be changed or developed.

    使用 Git 提交文件的时候,显示新建、删除了很多文件(这些文件这一次根本没有改动到,git status 也没有显示这些文件),我实际只提交了那个圈起来的文件。

    各位有谁遇到过这种情况吗,需要怎么解决呢?

    image.png

    Supplement 1  ·  Dec 24, 2021
    仍然不知道是什么问题,也不知道是什么原因导致的,上次也出现过:提交历史记录我删了一个文件,push 之后才发现。然后将这个文件加一行空行,再次 commit ,然后...显示另一个文件被删了。

    目前通过以下的方式解决:
    1 、在另一个目录下 clone 代码
    2 、删除原项目中的 .git 目录
    3 、复制刚克隆的 .git 目录过去

    感谢大家的回复。
    39 replies  •  2021-12-28 17:12:06 +08:00
    DawnMoon
    DawnMoon
    Dec 24, 2021 via Android❤️1
    1
    你能把你提交的命令行步骤都贴一下吗?
    xiaomimei
    xiaomimei
    Dec 24, 2021 via Android❤️1
    2
    git diff HEAD 看看呢,是不是被改了文件权限之类的
    GOXXX
    GOXXX
    Dec 24, 2021❤️1
    3
    盲猜可能文件名大小写问题
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    4
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    5
    @xiaomimei #2

    执行 git diff HEAD | grep admin 和 git diff HEAD | grep dymini 输出结构都是空
    Trim21
    Trim21
    Dec 24, 2021 via Android❤️1
    6
    看你截图里这些文件都已经 commit 了,得用 diff HEAD^1 查看修改吧
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    7
    @Trim21 #6 也是没有的
    trn4
    trn4
    Dec 24, 2021 via iPhone❤️1
    8
    @ddllzz #4 status 不是显示了这些文件了猫
    trn4
    trn4
    Dec 24, 2021 via iPhone❤️1
    9
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    10
    @xiadong1994 #8 没有啊,比如 start.sh 就没有
    66beta
    66beta
    Dec 24, 2021❤️1
    11
    装个 GUI 吧
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    12
    @66beta #11
    用 PhpStorm 提交,看着正常,但是查看记录还是有问题。
    jimliang
    jimliang
    Dec 24, 2021❤️1
    13
    可以能是什么工具加了 git hook , `cat .git/hooks/pre-commit` 看下提交前有哪些操作
    yanguoyu
    yanguoyu
    Dec 24, 2021❤️1
    14
    #13 楼说的很有可能
    anzu
    anzu
    Dec 24, 2021❤️1
    15
    IDE 自动加的吧
    Edsie
    Edsie
    Dec 24, 2021❤️1
    16
    麻烦看一下 ga 的 alias
    是不是缩写成了 git add . 后面跟了“点”
    导致工作区的改动全部都到了暂存区
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    17
    @yanguoyu #14
    @jimliang #13
    感谢二位回复,提交前是有执行一些动作的,但是绝对不会在这里删除文件的,而且显示被删除的文件其实还在。
    ddllzz
    ddllzz
    OP
    Dec 24, 2021
    18
    @Edsie #16
    @anzu #15
    主要是我根本没有动到这些文件,即使不小心添加了,也不可能自动删除文件。
    catxo
    catxo
    Dec 24, 2021❤️1
    19
    也许你需要 git config core.fileMode true ?
    xtinput
    xtinput
    Dec 24, 2021❤️1
    20
    你搞个 GUI 的 git 软件吧,直观
    yulon
    yulon
    Dec 24, 2021❤️1
    21
    盲猜是自动转换换行符,而 diff 是不会考虑换行符的
    guog
    guog
    Dec 24, 2021 via Android❤️1
    22
    这里变更的都是 file mode ,是不是变成可执行文件了,比如 644 到 755
    Mutoo
    Mutoo
    Dec 24, 2021❤️2
    23
    楼上正解,这里 log 出来的并不是文件的增删,而是文件限权的变更。

    git 除了记录文件的修改历史,还会记录一份文件的权限,使得在不同的操作系统上 clone 的时候可以恢复文件的权限,例如让 bin 在 checkout 后可以运行。

    https://stackoverflow.com/a/8347325
    yikang
    yikang
    Dec 25, 2021
    24
    @Mutoo 应该不是权限的变更。

    正常权限变更,提交后的信息是会详细描述的:

    ```bash
    [master 91afb7b] Change mode
    1 file changed, 0 insertions(+), 0 deletions(-)
    mode change 100644 => 100755 1
    ```

    ---
    @ddllzz 可以提供更多的信息,比如:

    * `git config --list` 输出内容
    * 使用的操作系统

    。。。
    sutra
    sutra
    Dec 25, 2021
    25
    git diff 看看,或者 git show commit-id
    trn4
    trn4
    Dec 25, 2021 via iPhone
    26
    首先你先别用 alias 用原始的 git
    jinliming2
    jinliming2
    Dec 25, 2021
    27
    @ddllzz #4 看这个截图,你 gst 后的输出就显示了这些文件都发生了变更,运行 git diff 看一下具体的变更内容再做判断。
    另外,你 ga 之后应该只添加了一个文件,但是 gcmsg 之后看起来是提交了多个文件。请在 ga 之后 gst 看看是不是只有一个文件变绿了?
    另外,我还注意到,你 gst 之后打印的文件列表和 gcmsg 之后打印的文件列表对应不上,确认一下你的 gcmsg 都执行了什么操作?

    建议不要使用 alias ,使用原始 git 并禁用 hooks 看看是否还有问题:
    gst => git status
    ga xxx => git add xxx
    gcmsg "xxx" => git commit --no-verify -m "xxx"
    (加 no-verify 是用来禁用 hooks 的)
    ddllzz
    ddllzz
    OP
    Dec 25, 2021
    28
    @yikang #24
    @sutra #25
    @xiadong1994 #26
    @jinliming2 #27
    不使用 alias ,禁用 hooks 的效果。(感觉不是我提交文件的操作有问题,而是在此之前我的某些不当操作导致的问题,因为我删除项目中的 .git 目录,并替换成线上的 .git 目录之后,就一切正常了)
    ![image.png]( https://s2.loli.net/2021/12/25/SqPIZcWzsAeRUCQ.png)
    ![image.png]( https://s2.loli.net/2021/12/25/R6Tg8YwPDqf9m5y.png)
    ![image.png]( https://s2.loli.net/2021/12/25/7BiwdHcMuojWfEK.png)
    ![image.png]( https://s2.loli.net/2021/12/25/y8zdiKbRMXVt76s.png)

    配置如下:
    ![image.png]( https://s2.loli.net/2021/12/25/tsuOlna1edoWRAI.png)
    系统:
    ![image.png]( https://s2.loli.net/2021/12/25/dCfEgIm7t96UVKb.png)
    sutra
    sutra
    Dec 25, 2021
    29
    你别光 git status 呀,你倒是 git diff 我看看。也许只是换行符之类的变化。
    ddllzz
    ddllzz
    OP
    Dec 25, 2021
    30
    @sutra #29 git diff 那么多我要怎样给你看呢

    我撤销有问题的提交之后,执行:git --no-pager diff 最后一次 commit id | grep 文件名的结果如下

    mini.php 是有改动的。admin.php 我没改动,但是提交之后显示删除的。

    ![image.png]( https://s2.loli.net/2021/12/25/iUbKQJdHZaz1ARO.png)
    sutra
    sutra
    Dec 26, 2021
    31
    无语。你不 git diff ,我怎么知道你那发生了什么。
    sutra
    sutra
    Dec 26, 2021
    32
    git diff 某个具体的文件也可以呀,也并不需要 diff all 。
    sutra
    sutra
    Dec 26, 2021
    33
    你这 git diff | grep filename 有啥意义,这输出不是和 git status 内容差不多,只有文件名,没有变化内容。到底发生了什么变化,不还是看不出?
    tywtyw2002
    tywtyw2002
    Dec 27, 2021 via iPhone
    34
    看起来像是 git hash collision 了吧。
    ddllzz
    ddllzz
    OP
    Dec 27, 2021
    35
    @sutra #33 因为我以为:列出文件变化内容,肯定得列出文件名。

    这么是 git diff 单个文件的结果

    [![T0xZvt.png]( https://s4.ax1x.com/2021/12/27/T0xZvt.png)]( https://imgtu.com/i/T0xZvt)
    sutra
    sutra
    Dec 27, 2021 via iPhone
    36
    你 diff 个 deleted file ?
    wangtian2020
    wangtian2020
    Dec 28, 2021
    37
    用 sourcetree 图形化界面提交 git 就不会出现这种问题
    yangwa
    yangwa
    Dec 28, 2021
    38
    以前有碰到过,有所谓对的多次逆向合并,但没深究
    index90
    index90
    Dec 28, 2021
    39
    怕不是你仓库里有大小写文件名?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3221 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 04:26 · PVG 12:26 · LAX 20:26 · JFK 23:26
    ♥ Do have faith in what you're doing.