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 · 5112 次点击
    这是一个创建于 1066 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 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 也是没有的
    xiadong1994
        8
    xiadong1994  
       2021-12-24 14:34:36 +08:00 via iPhone   ❤️ 1
    @ddllzz #4 status 不是显示了这些文件了猫
    xiadong1994
        9
    xiadong1994  
       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
    xiadong1994
        26
    xiadong1994  
       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   ·   实用小工具   ·   1351 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 17:24 · PVG 01:24 · LAX 09:24 · JFK 12:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.