协慌网

登录 贡献 社区

如何在 Git 中停止跟踪并忽略对文件的更改?

我克隆了一个包含一些.csproj文件的项目。我不需要 / 喜欢我的本地csproj文件被 Git 跟踪(或者在创建补丁时被启动),但显然它们在项目中是必需的。

我已将*.csproj添加到我的 LOCAL .gitignore ,但文件已经在 repo 中。

当我输入 git status 时,它显示我对csproj更改,我对跟踪或提交补丁不感兴趣。

如何从我的个人仓库中删除这些文件的 “跟踪”(但是将它们保存在源代码中以便我可以使用它们)以便在我执行状态(或创建补丁)时看不到更改?

是否有正确 / 规范的方法来处理这种情况?

答案

只是在要从修订控件中删除的每个文件上调用git rm --cached应该没问题。只要您的本地忽略模式正确,您就不会在 git status 的输出中看到这些文件。

请注意,此解决方案会从存储库中删除文件,因此所有开发人员都需要维护自己的本地(非版本控制)文件副本

要防止 git 检测到这些文件中的更改,您还应该使用以下命令:

git update-index --assume-unchanged [path]

你可能想做什么:(来自@Ryan Taylor 的答案

  1. 这是告诉 git 你想要自己的文件或文件夹的独立版本。例如,您不想覆盖(或删除)生产 / 暂存配置文件。

git update-index --skip-worktree <path-name>

完整的答案在此 URL: http//source.kohlerville.com/2009/02/untrack-files-in-git/

如果你执行git update-index --assume-unchanged file.csproj ,git 将不会自动检查 file.csproj 是否有更改:这将阻止它们在你更改它们时进入 git 状态。因此,您可以通过这种方式标记所有. csproj 文件 - 尽管您必须手动标记上游存储库发送给您的任何新文件。 (如果你的.gitignore.git/info/exclude有它们,那么你创建的那些将被忽略)

我不完全确定. csproj 文件是什么...... 如果它们是 IDE 配置(类似于 Eclipse 的. eclipse 和. classpath 文件),那么我建议它们应该永远不会被源代码控制在所有。另一方面,如果它们是构建系统的一部分(比如 Makefiles)那么显然它们应该 --- 并且一种方法来获取可选的局部更改(例如从 local.csproj a la config.mk)将是有用的:将构建分为全局部分和本地覆盖。

这是一个两步过程:

  1. 删除文件 / 文件夹的跟踪 - 但保留在磁盘上 - 使用

    git rm --cached

    现在他们没有显示为 “已更改” 但仍显示为

    untracked files in  git status -u
  2. 将它们添加到.gitignore