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


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

我已经添加了 *.csproj 到我的本地 .gitignore,但文件已经在回购中。

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

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

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


1433
2018-06-01 19:08


起源


一个非常有用的问题,但我很好奇为什么你不想跟踪对的变化 .csproj 文件,这是任何项目的重要组成部分。改变了 .csproj.user 档案或任何 .Publish.XML 文件我完全可以理解不跟踪,但我很感兴趣为什么你不想跟踪 .csproj... - Owen Blacker
也许他们使用不同的IDE? - Jarrett
具有讽刺意味的是,我来到这个主题是因为我希望从回购中删除.suo文件但是将它们保存在本地。对于后代,.Net开发要求您将.csproj文件保存在repo中,并且应始终跟踪这些更改,除非您想要感受项​​目中任何其他开发人员的愤怒。如果不确定,请查看GitHub上的gitignore文件仓库: github.com/github/gitignore/blob/master/VisualStudio.gitignore - longda
@Cupcake,你关联的问题是在这个问题发布15天之后写的?也许你有另一个想法? - stephenmurdoch
@marflar规范问题不一定非必要 最老的 那些,只是 最好 那些。我链接的那个有20个答案,而这个答案只有5个。


答案:


只是打电话 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/


1799
2018-06-01 19:16



“git rm --cached <file>”将从版本控制中删除<file>,同时将其保留在工作存储库中。是否是你想要的...... - Jakub Narębski
但是当其他人拉出存储库时,他们自己的* .csproj文件会被删除吗?因为如果我们希望文件不被跟踪,而不是删除。 - FMaz008
如果您尝试删除目录中的所有文件,请将其与git ls-files结合使用: git ls-files | xargs git rm --cached - 这将从给定目录中的git索引中删除所有内容而不删除实际文件。 - Marco
git rm --cached -r <dir> 以递归方式处理文件夹及其中的所有文件。 - Chris K
这将停止跟踪文件,在本地保留它,但会导致它 删除 对于那些拉扯的人 - Edward Newell


如果你这样做 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)将是有用的:将构建分为全局部分和本地覆盖。


224
2018-06-01 19:24



你怎么撤消这个? - Ian Hunter
git update-index --no-assume-unchanged file.csproj - araqnid
csproj是一个C#项目文件,它跟踪项目中包含哪些文件以及其他几个配置,它必须是源代码控制的,以便项目工作 - SparK
这是这里唯一正确的答案!我多年来一直在使用@araqnids答案,它完全按照要求解决这个问题。 - NHDaly
@GreenAsJade: git ls-files -v 将显示假设未使用小写指示符的文件(例如 h 而不是平常 H 对于缓存文件)。 - Amadan


这是一个两步过程:

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

    git rm --cached 
    

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

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


135
2017-08-02 14:25



不,这将从跟踪中删除文件,在本地保存它, 但是对于那些拉扯的人来说,它会被删除。 - Edward Newell
在我的情况下,我不小心添加了一个我不想跟踪的文件夹,所以这就是我需要的。 - Sonny
是的,这问题确实是错误的答案 - 但对于在搜索结果中找到这个问题的大多数人来说,这可能是正确的答案(就像我一样)。 - Andrew Spencer


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

1。 这将为您保留本地文件,但是当它们拉动时将为其他任何人删除它。

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

2。 这用于优化,例如具有大量文件的文件夹,例如SDK可能永远不会改变。它告诉git每次都要停止检查那个巨大的文件夹进行更改,因为它不会有任何更改。

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

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

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

知道这一点很重要 git update-index  不会传播 使用git,每个用户都必须独立运行它。


110
2017-10-26 21:18



这个答案是最完整的 - 它提供了各种各样的解决方案。我正在使用的具体情况是在配置文件中嵌入了密码。我想传播模板文件,然后将密码添加到我的副本。应忽略带有密码的副本,不要覆盖。 - bmacnaughton
如何在我的本地检查哪些文件适用于'假设未更改'或'跳过工作树'? - Supawat Pusavanno
@SupawatPusavanno查看您之前选择的假设未更改或跳过工作树的文件查看此答案 stackoverflow.com/questions/42363881/...  - 它用 grep 和 git ls-files - Ryan Taylor
很好的答案。但是当我尝试切换到另一个分支时,git会抛出错误:错误:“您对以下文件的本地更改将被checkout覆盖.....”并且解决方案是在切换之前隐藏更改并在非切换时隐藏更改你回到了分店。 - PhantomReference


接受的答案仍然不适合我

我用了

git rm -r --cached。

git add。

git commit -m“fix .gitignore”

找到了答案 这里 


78
2017-09-18 05:44



该链接非常有用,尤其是以递归方式删除.gitignore中的所有文件 - rmcsharry
我已经回到这里3次了,希望我能在下次之前承诺记忆! - Harry Bosh


忘了你的.gitignore?

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

git rm --cached -r .

确保你是项目的根。

然后你可以照常做

git add .

承诺

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

git push origin master

结论

希望这有助于那些必须改变他们的人 .gitignore 或者忘了一起。

  • 它删除整个缓存
  • 看看你的.gitignore
  • 添加要跟踪的文件
  • 推送你的回购

37
2017-11-04 10:25



当您谈论删除或添加时,您忘记了说何时何地。从曲目列表中删除?从存储库?从当地的项目空间?拉扯?在提交?在推?唉,这里的所有作者都有同样的问题。 - Gangnus
@Gangnus我认为没有人'澄清'你想要做的这一点,因为很明显该文件实际上并没有从磁盘或存储库中删除。此答案指定命令的时间顺序。正如你的评论所暗示的那样,这并不神秘或不明白。 - Anthony


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

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

要么

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

等等。


20
2017-11-07 13:18



这是一个非常好的解决方案,因为你想要一步一步地修复gitignore - cutiko


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

回答 另一个问题表明它可能是需要的跳过工作树。

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

20
2018-05-12 11:33



不,不是真的: --skip-worktree 习惯了 将文件保留在存储库中但停止跟踪其更改。正如你的答案所说: - 当你指示git因为开发人员而不接触特定文件时, - skip-worktree非常有用 应该 更改 - Erdal G.
@ErdalG。究竟。根据问题,他们想要忽略文件中的任何更改,但将文件保留在repo中 - the_new_mr
同意@the_new_mr, --assume-unchanged 和 --skip-worktree 有类似的效果,但他们的目的是完全不同的。前一个是通过欺骗git来加速git性能 不检查特定文件而后者是为了 忽略特定文件的未来变化,适用于运行时但必不可少的文件。 - Victor Wong


防止通过git监视文件

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

并将其还原使用

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

3
2018-04-18 09:41