为什么‘git add *’无法追踪已删除文件及特定非点开头.sh文件?
为什么
git add *无法追踪已删除的文件? 这个问题的核心其实不在Git本身,而是你的shell(比如bash、zsh这类命令行环境)对*通配符的处理逻辑,我给你拆解清楚:
当你输入
git add *时,shell会先于Git执行通配符展开:它会把*替换成当前目录下实际存在的所有非隐藏文件/文件夹列表。如果那个.sh文件已经被你从文件系统中删除了,shell在扫描时根本找不到它,自然不会把它加入到传给Git的参数里。Git收到的只是当前存在的文件,当然不会处理已删除的那个文件。而当你明确指定文件名(比如
git add test.sh)时,情况就不一样了:Git会直接根据你给出的文件名去检查它在仓库中的状态——如果这个文件之前已经被Git追踪过,现在文件系统里没了,Git就会识别到“这个追踪过的文件被删除了”,进而把删除操作记录到暂存区。
如果你想一次性处理所有变更(包括新增、修改、删除的文件),不用手动指定每个文件,可以用git add --all(简写git add -A),这个命令会让Git自己扫描整个仓库的状态变化,完全绕过shell的通配符展开,就能自动捕获到已删除的文件了。
你也可以用echo *命令验证一下:在删除文件后执行这个命令,输出的列表里肯定没有那个已删除的.sh文件,这就能直观看到shell展开的结果。
内容的提问来源于stack exchange,提问作者Michael Chao
相关产品推荐
相关产品推荐

