在Git中停止跟踪并忽略文件更改的方法

在Git中停止跟踪并忽略文件更改的方法

技术背景

在使用Git进行版本控制时,有时我们不希望某些文件被纳入版本控制,或者不希望Git检测到这些文件的更改。例如,配置文件包含敏感信息,不同开发环境下的配置不同,我们不希望这些配置文件的更改被提交到远程仓库。此时,就需要掌握在Git中停止跟踪并忽略文件更改的方法。

实现步骤

方法一:使用git rm --cached

此方法会将文件从版本控制中移除,但保留本地文件。

  1. 对于单个文件,使用git rm --cached <file-name>;对于文件夹,使用git rm -r --cached <folder-name>
  2. 执行完上述命令后,这些文件在git status中会显示为未跟踪文件。
  3. 若要将这些文件彻底忽略,可将其添加到.gitignore文件中。

方法二:使用git update-index --assume-unchanged

该方法用于告诉Git假设文件不会被更改,可优化性能,适用于大型文件夹或不太可能更改的文件。

  1. 执行git update-index --assume-unchanged <path-name>,Git将停止自动检查该文件的更改。
  2. 若要恢复跟踪,使用git update-index --no-assume-unchanged <path-name>

方法三:使用git update-index --skip-worktree

此方法用于告诉Git你想要文件或文件夹的独立版本,不会覆盖或删除生产/暂存配置文件。

  1. 执行git update-index --skip-worktree <path-name>
  2. 若要恢复跟踪,使用git update-index --no-skip-worktree <path-name>

应用.gitignore到当前或未来项目

  1. 提交最新的.gitignore文件:
1
2
git add .gitignore
git commit -m "Create .gitignore"
  1. 对当前索引应用标准的Git忽略行为:
1
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
  1. 可选步骤:将之前被忽略但现在不应被忽略的文件添加到索引中:
1
git add *
  1. 再次提交:
1
git commit -m "re-applied modified .gitignore"

核心代码

移除文件跟踪并添加到.gitignore

1
2
git rm --cached <file-name>
echo "<file-name>" >> .gitignore

假设文件不变

1
2
3
git update-index --assume-unchanged <path-name>
# 恢复跟踪
git update-index --no-assume-unchanged <path-name>

跳过工作树

1
2
3
git update-index --skip-worktree <path-name>
# 恢复跟踪
git update-index --no-skip-worktree <path-name>

最佳实践

  • 对于不太可能更改的文件或文件夹,如SDK,使用git update-index --assume-unchanged
  • 对于包含敏感信息或不同环境配置不同的文件,使用git update-index --skip-worktree
  • 确保.gitignore文件正确配置,避免不必要的文件被跟踪。

常见问题

执行git update-index --assume-unchanged后,拉取上游更改时文件被覆盖

这是因为--assume-unchanged假设文件不会更改,当有上游更改时,索引会被重置,文件会被覆盖。此时可使用git update-index --no-assume-unchanged恢复跟踪,解决冲突后再重新设置。

.gitignore不生效

可能是操作顺序问题,应先执行git rm --cached xxx,再修改.gitignore文件。另外,确保.git/info/exclude.gitignore文件存在且配置正确。


在Git中停止跟踪并忽略文件更改的方法
https://119291.xyz/posts/git-stop-tracking-and-ignore-file-changes/
作者
ww
发布于
2025年5月22日
许可协议