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

Joshua Ball 1634 git

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

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

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

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

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

anthony.. 2023

只需调用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 rm --cached <file>"将从版本控制中删除<file>,同时将其保留在工作存储库中.是否是你想要的...... (180认同)
  • `git rm --cached -r <dir>`递归地处理文件夹及其中的所有文件. (124认同)
  • 但是当其他人拉出存储库时,他们自己的*.csproj文件会被删除吗?因为如果我们希望文件不被跟踪,而不是删除. (50认同)
  • 这将停止跟踪文件,在本地保留它,但导致它被*删除*为任何人拉 (35认同)
  • 如果您尝试删除目录中的所有文件,请将其与git ls-files结合使用:`git ls-files | xargs git rm --cached` - 将删除给定目录中git索引的所有内容,而不删除实际文件. (23认同)
  • 有人可以提出一个解决方案/链接,不会从其他团队成员的存储库中删除文件(如FMaz008和jackocnr所述). (10认同)
  • 它不仅会删除任何人提取的文件,如果您在删除之前签出修订版本,它会删除您的文件,然后在删除后查看修订版本. (8认同)
  • 这里有一个完整的示例来删除所有战争文件被跟踪.$ git ls-files | grep"\ .war"| xargs git rm --cached (7认同)
  • 我不明白为什么这个问题被接受为答案,因为它不是答案.我会将araqnids答案标记为正确答案. (6认同)
  • 根据手册:git-rm - 从工作树和索引中删除文件这正是我不想做的事情.我错过了什么吗?但是,查看git rm的文档,我看到--cached --cached:使用此选项仅从索引中取消并删除路径.无论是否修改了工作树文件,都将保持不变.我想这就是我需要的,对吧? (5认同)
  • FMaz008如果你git rm -cached .csproj那么它将从版本控制中删除它.然后,您要将其添加到项目的.gitignore文件中.这应该允许每个人保留他们自己的.cdproj文件,即使他们拉. (3认同)
  • @ChanKim这不起作用.正如所指出的,这标记了要删除的文件,当有人稍后进行/合并时,它将被删除. (3认同)
  • @Statuswoe我的同事刚刚说它删除了他的文件版本.他不是很开心. (2认同)
  • 我多年来一直在使用@araqnids答案,它完全按照要求解决了这个问题.任何其他答案都是不对的. (2认同)
  • 这个答案是错误的 - OP想要"如何从我的个人仓库中删除"跟踪"这些文件(**但是将它们保存在源代码中以便我可以使用它们**") (2认同)

araqnid.. 241

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

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

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

Ryan Taylor.. 200

有3种选择,你可能想要#3

1.这将保留本地文件,但是当它们拉动时会将其删除.

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

2.这是为了优化,就像一个包含大量文件的文件夹,例如可能永远不会改变的SDK.它告诉git每次在本地停止检查那个巨大的文件夹,因为它没有任何更改.该assume-unchanged指数将被重置,文件(S)覆盖,如果有文件/文件夹上游的变化(当你拉).

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

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

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

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

  • 这个答案是最完整的 - 它提供了各种各样的解决方案.我正在使用的具体情况是在配置文件中嵌入了密码.我想传播模板文件,然后将密码添加到我的副本.带密码的副本应该被忽略而不会被覆盖. (6认同)
  • @SupawatPusavanno可以查看您先前选择用于假定不变或跳过工作树的文件,请查看此答案/sf/ask/17360801/它使用`grep`和`git ls-files` (3认同)

rjha94.. 147

这是一个两步过程:

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

    git rm --cached 
    

    现在他们不会显示为"已更改"但仍显示为

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

  • 不,这将从跟踪中删除文件,在本地保留它,*但是对于拉*的任何人都要删除它. (54认同)
  • 是的,这问题确实是错误的答案 - 但对于大多数人来说,在搜索结果中找到这个问题(像我一样)可能是正确的答案. (3认同)

小智.. 91

接受的答案仍然不适合我

我用了

git rm -r --cached.

git add.

git commit -m"fix .gitignore"

这里找到答案

  • 我已经回到这里3次,希望我能在下次之前承诺记忆! (9认同)

Joe Lloyd.. 44

忘了你的.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
  • 添加要跟踪的文件
  • 推送你的回购

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

the_new_mr.. 25

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

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

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

  • @ErdalG.究竟.根据问题,他们想要忽略文件中的任何更改,但将文件保留在repo中 (4认同)
  • 不,不是真的:`--skip-worktree`用于将文件保存在存储库中但停止跟踪其更改**.正如你的答案所说:_--当你指示git不要触摸特定文件时,skip-worktree是有用的,因为开发人员**应该**改变它_ (2认同)

Peter.. 21

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

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

要么

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

等等


shijin.. 12

防止通过git监视文件

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

并将其还原回使用

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

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


belka.. 9

很多人建议你使用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:创建此类的第一个版本,填写您可以填写的字段并将其他人留空/ null.
  • 2:提交并将其推送到远程服务器.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4:使用您自己的参数更新配置类.
  • 5:回到另一个功能的工作.

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

PS:做一个或另一个,但不是两个,因为你会有不良的副作用.如果你想尝试另一个标志,你应该先禁用后者.


Ruto Collins.. 6

要告诉Git不要跟踪对本地文件/文件夹的更改(意味着git status不会检测到对它的更改),请执行以下操作:

git update-index --skip-worktree path/to/file

并告诉Git再次跟踪对本地版本的更改(以便您可以提交更改),执行:

git update-index --no-skip-worktree path/to/file


归档时间:

查看次数:

662396 次

最近记录:

9 月,2 周 前