.gitignore is ignored by Git
技术背景
在使用 Git 进行版本控制时,.gitignore
文件用于指定那些不需要被 Git 跟踪的文件或目录。然而,有时候会遇到 .gitignore
文件不生效的情况,即 Git 仍然跟踪了 .gitignore
中指定要忽略的文件。
实现步骤
通用解决步骤
- 备份仓库:为了避免数据丢失,在进行操作前最好备份仓库。
- 检查文件是否已被跟踪:如果文件已经被跟踪,需要先从缓存中移除。
1 2 3
| git rm -r --cached . git add . git commit -m "fixed untracked files"
|
- 检查编码问题:确保
.gitignore
文件的编码为 ASCII 或 UTF - 8。可以使用以下 PowerShell 命令将文件编码转换为 UTF - 8。
1 2
| $Myfile = Get-Content .\.gitignore $Myfile | Out-File -Encoding "UTF8" .gitignore
|
- 检查行尾符:不同操作系统使用不同的行尾符,确保
.gitignore
文件的行尾符与系统一致。- Windows:使用 Windows 行尾符(CR + LF)。可以在 Notepad++ 中通过
Edit
-> EOL Conversion
-> Windows Format
进行转换。 - Linux:使用 Linux 行尾符(LF)。
- 检查注释和空格:
- 避免在
.gitignore
文件中使用内联注释。 - 避免在规则前有空格或制表符,以及规则后有尾随空格。
- 检查文件路径:确保
.gitignore
文件位于项目的根目录。
特殊情况解决步骤
已提交文件
如果要忽略已经提交到仓库的文件,可以使用以下命令将其从仓库中移除,但保留在本地。
1
| git rm -r -f "folder or files insides"
|
安装 PLM 软件后添加版本控制
如果在对已进行大量初始工作的项目添加版本控制后 .gitignore
不生效,且不敢使用 git rm --cached
命令,可以按以下步骤操作:
- 删除
.git
和 .gitignore
文件。
1 2
| rm -rf .git rm -rf .gitignore
|
- 获取修改文件列表。
1
| Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName
|
- **Bash**:
1
| find ./ -type f -mtime -10
|
- 重新初始化仓库并创建
.gitignore
文件。
Visual Studio 2013 问题
如果 Visual Studio 2013 忽略了 .gitignore
文件,可以按以下步骤操作:
- 关闭 Visual Studio。
- 导航到
.git
文件夹。 - 删除
ms - persist.xml
文件。 - 重启 Visual Studio。
多个 Git 客户端冲突
如果同时运行多个 Git 客户端(如 “git shell” + “GitHub Desktop”)导致 .gitignore
不生效,应只使用一个 Git 客户端,尤其是在清除 Git 缓存时。
符号链接问题
如果 .gitignore
文件中忽略的目录是符号链接,需要调整规则。例如,将 lib/ext/
改为 lib/ext
。
忽略自身问题
如果 .gitignore
文件设置为忽略所有文件,但又需要跟踪 .gitignore
文件本身,可以在文件中添加 !.gitignore
。
使用 sudo
编辑问题
如果使用 sudo
编辑 .gitignore
文件导致不生效,可以使用普通权限编辑,如 nano .gitignore
。
核心代码
从缓存中移除所有文件
添加所有文件并提交
1 2
| git add . git commit -m "fixed untracked files"
|
强制添加文件
1 2
| git add -f [files you want to track again] git commit -m "Refresh removing files from .gitignore file."
|
清理未跟踪文件
重置 HEAD
最佳实践
- 在项目开始时就创建
.gitignore
文件,并在第一次提交前添加需要忽略的文件和目录。 - 将常用的忽略规则添加到
~/.gitignore_global
文件中,让 Git 了解你通常忽略的文件。 - 定期检查
.gitignore
文件的编码、行尾符和规则是否正确。
常见问题
- 编码问题:不同的编码可能导致
.gitignore
文件不被正确解析。建议使用 UTF - 8 编码。 - 文件已被跟踪:如果文件已经被跟踪,
.gitignore
文件将不再对其生效。需要先从缓存中移除该文件。 - 多个 Git 客户端冲突:同时运行多个 Git 客户端可能会导致冲突,建议只使用一个 Git 客户端。
- 符号链接问题:
.gitignore
文件中对符号链接的规则可能需要特殊处理。 - 注释和空格问题:内联注释、规则前的空格或制表符、规则后的尾随空格都可能导致规则失效。