Git 提交时莫名其妙删除文件 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
ddllzz
V2EX    git

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

  •  
  •   ddllzz 2021-12-24 12:42:18 +08:00 5658 次点击
    这是一个创建于 1387 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    image.png

    第 1 条附言    2021-12-24 14:30:59 +08:00
    仍然不知道是什么问题,也不知道是什么原因导致的,上次也出现过:提交历史记录我删了一个文件,push 之后才发现。然后将这个文件加一行空行,再次 commit ,然后...显示另一个文件被删了。

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

    感谢大家的回复。
    39 条回复    2021-12-28 17:12:06 +08:00
    villivateur
        1
    villivateur  
       2021-12-24 13:04:51 +08:00 via Android   1
    你能把你提交的命令行步骤都贴一下吗?
    xiaomimei
        2
    xiaomimei  
       2021-12-24 13:06:59 +08:00 via Android   1
    git diff HEAD 看看呢,是不是被改了文件权限之类的
    menghuan
        3
    menghuan  
       2021-12-24 13:10:17 +08:00   1
    盲猜可能文件名大小写问题
    ddllzz
        4
    ddllzz  
    OP
       2021-12-24 13:14:46 +08:00
    ddllzz
        5
    ddllzz  
    OP
       2021-12-24 13:16:50 +08:00
    @xiaomimei #2

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

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

    https://stackoverflow.com/a/8347325
    yikang
        24
    yikang  
       2021-12-25 00:29:30 +08:00
    @Mutoo 应该不是权限的变更。

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

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

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

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

    。。。
    sutra
        25
    sutra  
       2021-12-25 00:39:14 +08:00
    git diff 看看,或者 git show commit-id
    trn4
        26
    trn4  
       2021-12-25 01:54:27 +08:00 via iPhone
    首先你先别用 alias 用原始的 git
    jinliming2
        27
    jinliming2  
       2021-12-25 03:27:11 +08:00
    @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
        28
    ddllzz  
    OP
       2021-12-25 11:01:57 +08:00
    @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
        29
    sutra  
       2021-12-25 14:30:39 +08:00
    你别光 git status 呀,你倒是 git diff 我看看。也许只是换行符之类的变化。
    ddllzz
        30
    ddllzz  
    OP
       2021-12-25 17:31:52 +08:00
    @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
        31
    sutra  
       2021-12-26 23:33:08 +08:00
    无语。你不 git diff ,我怎么知道你那发生了什么。
    sutra
        32
    sutra  
       2021-12-26 23:34:02 +08:00
    git diff 某个具体的文件也可以呀,也并不需要 diff all 。
    sutra
        33
    sutra  
       2021-12-26 23:39:53 +08:00
    你这 git diff | grep filename 有啥意义,这输出不是和 git status 内容差不多,只有文件名,没有变化内容。到底发生了什么变化,不还是看不出?
    tywtyw2002
        34
    tywtyw2002  
       2021-12-27 05:53:51 +08:00 via iPhone
    看起来像是 git hash collision 了吧。
    ddllzz
        35
    ddllzz  
    OP
       2021-12-27 09:55:25 +08:00
    @sutra #33 因为我以为:列出文件变化内容,肯定得列出文件名。

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

    [![T0xZvt.png]( https://s4.ax1x.com/2021/12/27/T0xZvt.png)]( https://imgtu.com/i/T0xZvt)
    sutra
        36
    sutra  
       2021-12-27 13:40:42 +08:00 via iPhone
    你 diff 个 deleted file ?
    wangtian2020
        37
    wangtian2020  
       2021-12-28 09:20:15 +08:00
    用 sourcetree 图形化界面提交 git 就不会出现这种问题
    dengji85
        38
    dengji85  
       2021-12-28 11:22:02 +08:00
    以前有碰到过,有所谓对的多次逆向合并,但没深究
    index90
        39
    index90  
       2021-12-28 17:12:06 +08:00
    怕不是你仓库里有大小写文件名?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     989 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:02 PVG 07:02 LAX 16:02 JFK 19:02
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86