我克隆了一个包含一些 .csproj
文件的项目 . 我不需要/喜欢我的本地 csproj
文件被Git跟踪(或者在创建补丁时被启动),但显然它们在项目中是必需的 .
我已将 *.csproj
添加到我的LOCAL .gitignore
,但文件已在回购中 .
当我输入git status时,它显示我对 csproj
的更改,我对跟踪或提交补丁不感兴趣 .
如何从我的个人仓库中删除这些文件的“跟踪”(但是将它们保存在源代码中以便我可以使用它们)以便在我执行状态(或创建补丁)时看不到更改?
是否有正确/规范的方法来处理这种情况?
15 回答
为了节省时间,您添加到.gitignore的规则可用于删除多个文件/文件夹,即
git rm --cached app/**/*.xml
要么
git rm --cached -r app/widgets/yourfolder/
等等 .
There are 3 options, you probably want #3
1. 这将为您保留本地文件,但会在其他人拉动时将其删除 .
git rm --cached <file-name>
或git rm -r --cached <folder-name>
2. 这是用于优化的,就像具有大量文件的文件夹一样,例如可能赢得't ever change. It tells git to stop checking that huge folder every time for changes, locally, since it won'的SDK有任何 . 如果文件/文件夹有上游更改(拉动时),将重置
assume-unchanged
索引并覆盖文件 .3. 这是告诉git你想要自己的文件或文件夹的独立版本 . 例如,您不想覆盖(或删除) 生产环境 /暂存配置文件 .
用git知道
git update-index
will not propagate 是很重要的,每个用户都必须独立运行它 .我假设您正在尝试从git中删除单个文件 . 因为我会推荐下面的命令 .
git update-index --assume-unchanged
Ex - git update-index --assume-unchanged .gitignore .idea / compiler.xml
正如其他答案所指出的,选择的答案是错误的 .
另一个问题表明,它可能是需要的跳过工作树 .
要告诉Git不要跟踪对本地文件/文件夹的更改(意味着git status不会检测到对它的更改),请执行以下操作:
并告诉Git再次跟踪对本地版本的更改(以便您可以提交更改),执行:
要忽略对目录中所有文件(某种类型)的任何更改,我必须结合其中一些方法,否则如果以前不存在则创建文件 .
在下面,“excludedir”是我希望不看更改的目录的名称 .
首先,从更改跟踪缓存中删除任何现有的新文件(无需从文件系统中删除) .
您可以使用
modified:
执行相同的操作 .renamed:
有点复杂,因为您必须查看post->
位以获取新文件名,并执行前->
位,如下面deleted:
所述 .deleted:
文件证明有点复杂,因为您可以在本地系统上存在上面列表中的最后一个命令将再次从文件系统中删除文件,因此请随意省略 .
然后,从该目录阻止更改跟踪
如果你做
git update-index --assume-unchanged file.csproj
,git won 't check file.csproj for changes automatically: that will stop them coming up in git status whenever you change them. So you can mark all your .csproj files this way- although you'将不得不手动标记上游repo发送给你的任何新的 . (如果你在.gitignore
或.git/info/exclude
中有它们,那么你创建的那些将被忽略)我不完全确定.csproj文件是什么......如果它们是IDE配置(类似于Eclipse的.eclipse和.classpath文件),那么我建议它们应该永远不会被源代码控制在所有 . 另一方面,如果它们是构建系统的一部分(比如Makefiles)那么显然它们应该---并且一种方法来获取可选的局部更改(例如从local.csproj a la config.mk)将是有用的:将构建分为全局部分和本地覆盖 .
这是一个两步过程:
现在他们没有显示为“已更改”但仍显示为
.gitignore
我假设您正在询问如何删除特定文件夹或bin文件夹中的文件,而不是单独选择每个文件 .
您可以使用此命令:
git rm -r -f /<floder-name>\*
确保您位于该目录的父目录中 .
此命令将以递归方式"delete" bin /或build /文件夹中的所有文件 . 通过单词delete我的意思是git会假装那些文件是"deleted"并且不会跟踪那些文件 . git确实将这些文件标记为删除模式 .
确保你的.gitignore准备好即将到来的提交 .
Documentation : git rm
接受的答案仍然不适合我
我用了
从here找到答案
问题可能是由操作顺序引起的 . 如果你修改了首先是.gitignore,然后是git rm --cached xxx,你可能不得不继续遇到这个问题 .
Correct solution:
git rm --cached xxx
修改了.gitignore
Order invariant!
.gitignore在修改后重新加载!
只需在要从版本控制中删除的每个文件上调用
git rm --cached
就可以了 . 只要您的本地忽略模式正确,您就不会在git status的输出中看到这些文件 .请注意,此解决方案会从存储库中删除文件,因此所有开发人员都需要维护自己的本地(非版本控制)文件副本
要防止git检测到这些文件中的更改,您还应该使用以下命令:
What you probably want to do: (来自@Ryan Taylor answer以下)
完整的答案在此URL:http://source.kohlerville.com/2009/02/untrack-files-in-git/
很多人建议你使用
git update-index --assume-unchanged
. 实际上,这可能是一个很好的解决方案,但仅限于短期内 .您可能想要做的是:
git update-index --skip-worktree
.(第三个选项,你可能不想要的是:
git rm --cached
. 它将保留你的本地文件,但会被标记为从远程存储库中删除 . )Difference between the first two options?
assume-unchanged
是临时允许您隐藏文件的修改 . 如果你想隐藏对文件所做的修改,修改文件,然后检查另一个分支,你将不得不使用no-assume-unchanged
然后可能隐藏修改完成 .skip-worktree
将跟随您,无论您检查的分支,您的修改!Use case of assume-unchanged
它假定不应修改此文件,并在执行
git status
时为您提供更清晰的输出 . 但是当签出到另一个分支时,您需要重置标志并提交或存储更改 . 如果您在激活此选项的情况下拉动,则'll need to solve conflicts and git won' t自动合并 . 它实际上只隐藏修改(git status
不会显示标记的文件) .我喜欢使用它,当我只想停止跟踪更改一段时间提交与同一修改相关的一堆文件(
git commit -a
) .Use case of skip-worktree
您有一个包含参数(例如包括密码)的安装类,您的朋友必须根据其设置进行更改 .
1:创建此类的第一个版本,填写您可以填写的字段并将其他人留空/ null .
2:提交并将其推送到远程服务器 .
3:
git update-index --skip-worktree MySetupClass.java
4:使用您自己的参数更新配置类 .
5:回去处理另一个功能 .
无论分支如何,您所做的修改都会跟随您 . 警告:如果您的朋友也想修改此类,他们必须具有相同的设置,否则他们的修改将被推送到远程存储库 . 拉动时,文件的远程版本应覆盖您的文件 .
PS:做一个或另一个,但不是两个,因为你会有不良的副作用 . 如果你想尝试另一个标志,你应该先禁用后者 .
忘了你的.gitignore?
如果您在本地拥有整个项目但忘记添加git ignore并且现在正在跟踪一些不必要的文件,请使用此命令删除所有内容
确保你是项目的根 .
然后你可以照常做
添加
承诺
推
结论
希望这有助于那些必须对他们的
.gitignore
进行更改或者将它们全部忘记的人 .它删除整个缓存
查看你的.gitignore
添加要跟踪的文件
推送你的回购
防止通过git监视文件
并将其还原使用