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

2021-12-24 12:42:18 +08:00
 ddllzz

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

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

4858 次点击
所在节点    git
39 条回复
yulon
2021-12-24 19:47:13 +08:00
盲猜是自动转换换行符,而 diff 是不会考虑换行符的
guog
2021-12-24 19:57:09 +08:00
这里变更的都是 file mode ,是不是变成可执行文件了,比如 644 到 755
Mutoo
2021-12-24 20:33:22 +08:00
楼上正解,这里 log 出来的并不是文件的增删,而是文件限权的变更。

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

https://stackoverflow.com/a/8347325
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
2021-12-25 00:39:14 +08:00
git diff 看看,或者 git show commit-id
xiadong1994
2021-12-25 01:54:27 +08:00
首先你先别用 alias 用原始的 git
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
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
2021-12-25 14:30:39 +08:00
你别光 git status 呀,你倒是 git diff 我看看。也许只是换行符之类的变化。
ddllzz
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
2021-12-26 23:33:08 +08:00
无语。你不 git diff ,我怎么知道你那发生了什么。
sutra
2021-12-26 23:34:02 +08:00
git diff 某个具体的文件也可以呀,也并不需要 diff all 。
sutra
2021-12-26 23:39:53 +08:00
你这 git diff | grep filename 有啥意义,这输出不是和 git status 内容差不多,只有文件名,没有变化内容。到底发生了什么变化,不还是看不出?
tywtyw2002
2021-12-27 05:53:51 +08:00
看起来像是 git hash collision 了吧。
ddllzz
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
2021-12-27 13:40:42 +08:00
你 diff 个 deleted file ?
wangtian2020
2021-12-28 09:20:15 +08:00
用 sourcetree 图形化界面提交 git 就不会出现这种问题
dengji85
2021-12-28 11:22:02 +08:00
以前有碰到过,有所谓对的多次逆向合并,但没深究
index90
2021-12-28 17:12:06 +08:00
怕不是你仓库里有大小写文件名?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/824200

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX