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

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

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

当我输入 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 和 config.mk 中)的方法将很有用。 :将构建分为全局部分和局部替代。

有 3 个选项,您可能想要#3

1.这将为您保留本地文件,但在其他人拉出时将其删除。

git rm --cached <file-name>git rm -r --cached <folder-name>

2.这是为了进行优化,例如包含大量文件的文件夹,例如,可能永远不会更改的 SDK。它告诉 git 每次都停止在本地检查该大文件夹的更改,因为它没有任何更改。如果文件 / 文件夹有上游更改(当您拉出时),则assume-unchanged索引将被重置并且文件将被覆盖。

git update-index --assume-unchanged <path-name>

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

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

重要的是要知道git update-index 不会随 git 一起传播 ,并且每个用户都必须独立运行它。

这是一个两步过程:

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

    git rm --cached

    现在它们不会显示为 “已更改”,但仍显示为

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

接受的答案仍然对我不起作用

我用了

git rm -r --cached。

git 添加

git commit -m“修复. gitignore”

这里找到答案

忘记了. gitignore?

如果您在本地拥有整个项目,但是忘记了添加 gitignore,现在正在跟踪一些不必要的文件,请使用此命令删除所有内容

git rm --cached -r .

确保您是项目的根源。

那你可以照常做

git add .

承诺

git commit -m 'removed all and added with git ignore'

git push origin master

结论

希望这对必须更改.gitignore或一起忘记它的人们有所帮助。

  • 它删除了整个缓存
  • 看你的. gitignore
  • 添加您要跟踪的文件
  • 推送到您的仓库

正如其他答案中指出的那样,所选答案是错误的。

另一个问题的答案表明,可能需要跳过工作树。

git update-index --skip-worktree <file>

为了节省时间,您可以将添加到. gitignore 的规则用于删除多个文件 / 文件夹,即

git rm --cached app/**/*.xml

要么

git rm --cached -r app/widgets/yourfolder/

等等

防止通过 git 监视文件

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

并将其还原回使用

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

引用相似用例的仓库 https://github.com/awslabs/git-secrets

很多人建议您使用git update-index --assume-unchanged 。确实,这可能是一个很好的解决方案,但只是在短期内。

您可能想做的是: git update-index --skip-worktree

(您可能不希望使用的第三个选项是: git rm --cached 。它将保留您的本地文件,但将其标记为已从远程存储库中删除。)

前两个选项之间的区别?

  • assume-unchanged是暂时允许您隐藏文件中的修改。如果要隐藏对文件所做的修改,请修改文件,然后签出另一个分支,则必须使用no-assume-unchanged的文件,然后可能会存储已完成的修改。
  • skip-worktree会在您结帐的任何分支上跟随您,并进行您的修改!

assume-unchanged用例

它假定不应该修改此文件,并且在执行git status时为您提供更清晰的输出。但是,当签出到另一个分支时,您需要先重置标志,然后再提交或隐藏更改。如果在激活此选项的情况下进行拉动,则需要解决冲突,并且 git 不会自动合并。它实际上仅隐藏修改( git status不会向您显示已标记的文件)。

当我只想停止跟踪更改一段时间时,我喜欢使用它 + 提交一堆与同一修改相关的文件( git commit -a )。

skip-worktree用例

您有一个设置类,其中包含您的朋友必须根据其设置更改的参数(例如,包括密码)。

  • 1:创建此类的第一个版本,填写您可以填写的字段,并将其他字段保留为空 / 空。
  • 2:提交并将其推送到远程服务器。
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4:使用您自己的参数更新您的配置类。
  • 5:回去工作另一个功能。

您所做的修改将跟随您的任何分支。警告:如果您的朋友也想修改此类,则他们必须具有相同的设置,否则他们的修改将被推送到远程存储库。拉动时,文件的远程版本应覆盖您的文件。

PS:请选择其中一项,但请不要同时使用,因为这会产生不良的副作用。如果要尝试其他标志,则应先禁用后者。