Git跟踪外部文件后删除无法同步至仓库的问题排查
问题解决与疑问解答
一、删除文件后仓库未同步删除的解决办法
你遇到的问题是因为git add .只会追踪新增或修改的文件,不会自动识别本地删除的文件。要让Git感知到删除操作,需要执行带-A参数的add命令,或者直接用git rm删除仓库中的对应文件:
- 方式一:一次性追踪所有变更(包括删除)
git --git-dir="C:\gitdir\path\remote-work-tree-test\.git" --work-tree="C:\worktree\path\testfolder" add -A .
- 方式二:单独删除指定文件
git --git-dir="C:\gitdir\path\remote-work-tree-test\.git" --work-tree="C:\worktree\path\testfolder" rm <被删除的文件名>
执行完上述命令后再做commit和push,仓库里的文件就会同步删除了。之前git status显示“一切已更新”,是因为Git没检测到删除操作的变更,自然认为工作区和仓库状态一致。
二、将.gitattributes和.gitignore放在工作区外的配置方法
不需要把这两个文件放在工作目录里,通过Git配置可以指定它们的读取路径:
- 配置.gitignore路径:
git --git-dir="C:\gitdir\path\remote-work-tree-test\.git" config core.excludesfile "C:\gitdir\path\remote-work-tree-test\.gitignore"
- 配置.gitattributes路径:
git --git-dir="C:\gitdir\path\remote-work-tree-test\.git" config core.attributesfile "C:\gitdir\path\remote-work-tree-test\.gitattributes"
配置完成后,Git会自动去你指定的路径读取这两个文件的规则,无需放在工作区中。
三、能否只用--git-dir参数而无需--work-tree?
单独只用--git-dir不行,因为Git必须明确知道工作区的位置。不过可以通过配置仓库的core.worktree属性,来避免每次命令都加--work-tree参数:
git --git-dir="C:\gitdir\path\remote-work-tree-test\.git" config core.worktree "C:\worktree\path\testfolder"
配置后,后续执行Git命令时,只要指定--git-dir,Git会自动使用你配置好的工作区路径。如果想更省事,还可以设置环境变量GIT_DIR和GIT_WORK_TREE,这样连--git-dir都不用每次输入了。
内容的提问来源于stack exchange,提问作者bocodes
相关产品推荐
相关产品推荐

