git忽略指定的文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git忽略指定的文件相关的知识,希望对你有一定的参考价值。

参考技术A 我们在使用git进行协作开发的时候经常会遇到一些配置问题,不同成员使用的IDE可能不同,那么IDE生成的配置文件也就不同,比如开发JAVA,idea生成的配置文件为.iml,而eclipse为.project,那么如果把这些配置文件都提交至git上的话必将造成配置错乱,为避免这个问题,可以通过git的.gitignore来忽略指定的文件,这些文件只在本地有,git push的时候这些文件会被自动忽略。

在项目根目录下创建.gitignore文件,然后写入要忽略的文件名或者文件夹等,支持模糊匹配,以楼主电脑中一个项目为例

为啥 Git 不忽略我指定的文件?

【中文标题】为啥 Git 不忽略我指定的文件?【英文标题】:Why doesn't Git ignore my specified file?为什么 Git 不忽略我指定的文件? 【发布时间】:2011-04-19 12:19:29 【问题描述】:

我在.gitignore 中添加了以下行:

sites/default/settings.php

但是当我输入 git status 时,它会将文件显示为未暂存的文件。

有什么问题?所有其他模式都运行良好。

【问题讨论】:

Git: Remove a file from the repository without deleting it from the local filesystem 的可能重复项 我遇到了同样的问题,然后我发现我将 .gitignore 文件保存在不同的驱动器上:face-palm: 将内容保留在存储库中并忽略其中的更改是一个非常糟糕的主意。 确保已初始化存储库 【参考方案1】:

确保您的 .gitignore 位于工作目录的根目录中,并在该目录中运行 git status复制状态输出中的文件路径并将其粘贴到.gitignore.

如果这不起作用,那么很可能您的文件已被 Git 跟踪。您可以通过git status 的输出来确认这一点。如果文件未列在 “未跟踪的文件” 部分,则表明它已被 Git 跟踪,它将忽略来自 .gitignore 文件的规则。

在 Git 中忽略文件的原因是它们不会被添加到存储库中。如果你之前添加了一个你想被忽略的文件,那么 Git 会跟踪它,并且会跳过匹配它的忽略规则。 Git 这样做是因为该文件已经是存储库的一部分。

为了真正忽略该文件,您必须取消跟踪并将其从存储库中删除。您可以使用git rm --cached sites/default/settings.php 来做到这一点。这会从存储库中删除文件,而不会实际删除文件(这就是 --cached 所做的)。提交该更改后,该文件将从存储库中删除,忽略它应该可以正常工作。

【讨论】:

“工作目录的根目录”是什么意思? '.git' 存储库所在的目录? 工作目录是.git目录所在的目录,它本身就是仓库的根目录。就像当您将存储库克隆到 /xy/ 时,/xy/ 是您的工作目录,其中包含 /xy/.git/ 有时您还需要在git rm --cached 之后执行git add . 才能正确重建索引。 在 git status 中检查它的想法很棒。我一直在 Eclipse 的 Git Staging 中检查它,但路径不正确。谢谢! 我需要添加 -r(递归)标志,因为我也签入了嵌套文件夹。在我的情况下,我移动到我的 git 文件夹的根目录,然后运行命令 git rm --cached -r .vs/ 其中 vs 是我想从跟踪中删除的***文件夹。【参考方案2】:

我遇到了这个问题,这是一个老问题,但我希望跟踪该文件但不在某些工作副本上跟踪它,你可以运行它

git update-index --assume-unchanged sites/default/settings.php

【讨论】:

这实际上是我正在寻找的答案。所有其他答案都假定该文件是使用 git add 添加的,但情况并非总是如此。使用 Acquia Cloud,.gitignore 文件应该忽略 settings.php(例如),但该文件包含在第一次提交中。取消跟踪文件,只需将其从存储库中删除,因此将其从实时站点中删除... 也帮助了我 - 谢谢!投票赞成。我怀疑它仅适用于本地 git repo,并且一旦推送到远程并被其他开发人员克隆就不会持续存在? 是的,它只是本地的。 这个答案让我找到了我个人需要的 git 功能,这是为了避免跟踪我对存储在远程存储库中的设置文件的本地更改。我最终使用的命令是git update-index --skip-worktree filename【参考方案3】:

请使用此命令

git rm -rf --cached .
git add .

有时 .gitignore 文件即使是正确的也不起作用。 Git 忽略文件的原因是它们没有添加到存储库中。如果你之前添加了一个你想忽略的文件,它会被 Git 跟踪,任何跳过的匹配规则都会被跳过。 Git 这样做是因为该文件已经是存储库的一部分。

【讨论】:

? 在运行此命令之前,我建议您存储所有更改的 .这给我造成了混乱?【参考方案4】:

.gitignore 只会忽略您尚未添加到存储库中的文件。

如果你做了一个git add .,并且文件被添加到索引中,.gitignore 不会帮助你。您需要执行git rm sites/default/settings.php 将其删除,然后它将被忽略。

【讨论】:

thanks.but 如何仅从索引而不是工作目录中删除文件? git rm 应该这样做,但它可能会要求您使用 -f 选项将其从工作目录中删除。除了制作文件的副本,我还没有想到这一点,做git rm -f 然后恢复副本。 一样,伙计。在某处复制,将其删除,提交已删除状态,将文件添加回来,看看它们现在是如何被忽略的。【参考方案5】:

我遇到了同样的问题。 在.gitingore 中定义的文件在运行git status 时列为未跟踪文件。

这是因为.gitignore 文件以UTF-16LE 编码保存,而不是UTF8 编码。

.gitignore 文件的编码更改为UTF8 后,它起作用了。

【讨论】:

知道为什么文件编码很重要吗?也许没有正确读取路径?【参考方案6】:

有一些例子,例如我想在 git 中跟踪的应用程序配置文件(因此 .gitignore 将不起作用),但我需要更改本地设置。我不希望 git 管理这些文件或将它们显示为已修改。为此,我使用跳过工作树:

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

您可以通过列出文件并检查以 S 开头的行来确认文件是否被跳过

git ls-files -v | grep ^S

如果将来您想让 git 再次在本地管理文件,只需运行:

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

上面的麦斯卡力陀有一个很好的答案,这让我走上了正确的道路,但是

git update-index --assume-unchanged file/to/ignore.php

与 git 有一个合同,其中:用户承诺不更改文件并允许 Git 假设工作树文件与索引中记录的内容匹配。

但是,我更改了文件的内容,所以在我的情况下 --skip-worktree 是更好的选择。

Toshiharu Nishina 的网站提供了关于 skip-worktree 与假设不变的出色解释:Ignore files already managed with Git locally

【讨论】:

【参考方案7】:

我做了什么来成功忽略 settings.php 文件:

    git rm --cached sites/default/settings.php 提交(到这里都没有用) 手动删除sites/default/settings.php(这成功了) git 添加。 提交(成功忽略)

我认为如果 Git 上有已提交的文件,那么忽略不会按预期工作。只需删除文件并提交。之后它会忽略。

【讨论】:

【参考方案8】:

另一个可能的原因 - 几个 git 客户端实例同时运行。比如“git shell”+“GitHub Desktop”等


这发生在我身上,我使用“GitHub Desktop”作为主客户端,它忽略了一些新的 .gitignore 设置:提交后提交:

    你犯了一些错误。 接下来,提交:它忽略 .gitignore 设置。 Commit 包含 .gitignore 中提到的大量临时文件。 清除 git 缓存;检查 .gitignore 是否为 UTF8;删除文件-> 提交-> 移回文件;跳过 1 次提交 - 没有任何帮助。

原因:Visual Studio Code 编辑器在后台运行,打开的存储库相同。 VS Code 内置了 git 控件,这会产生一些冲突。

解决方案:仔细检查多个隐藏的 git 客户端,一次只使用一个 git 客户端,尤其是在清除 git 缓存时。

【讨论】:

【参考方案9】:

确保 .gitignore 没有扩展名!!它不能是 .gitignore.txt,在 Windows 中只需将文件命名为 .gitignore。它会起作用的。

【讨论】:

【参考方案10】:

我在 VS Code 终端上尝试了上述大多数命令,但出现以下错误:

fatal: pathspec '[dir]/[file]' did not match any files

我在 GitHub Desktop 上打开了这个项目,然后从那里忽略了它,它工作了。

【讨论】:

【参考方案11】:

我刚刚用 git 1.7.3.1 尝试过这个,并给出了如下结构:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

repo 是上面提到的“根”(我称之为工作树的根),.gitignore 只包含sites/default/settings.php,忽略对我有用(不管是否.gitignore 是否添加到仓库中)。这是否符合您的回购布局?如果不是,有什么不同?

【讨论】:

是的。它和你的完全一样。但不工作。所有其他模式都工作。正如我所说的问题肯定与 settings.php 文件夹有关。 我觉得将内容保存在您的存储库中并忽略其中的更改是一个非常糟糕的主意。 @YevgeniyAfanasyev 除了编译输出、IDE 用户设置、由您的工具链生成的所有其他临时文件...... 我的意思是在存储库中保持提交,而不仅仅是位于项目文件夹中的文件。为什么需要存储库中的临时文件?【参考方案12】:

以防万一以后有人遇到和我一样的问题:

如果你使用

*
!/**/
!*.*

删除没有扩展名的二进制文件的技巧,确保所有其他 gitignore 行都在下面。 Git 将从顶部读取 .gitignore,因此即使我的 gitignore 中有“test.go”,它也是文件中的第一个,并且在

之后变为“未忽略”
!*.*

【讨论】:

【参考方案13】:

我认为这里的优秀答案中遗漏的一件事是another *.gitignore* or multiple of them.的存在

在一个案例中,我克隆了一个 repo,但无法弄清楚为什么在运行 git add 时会再次添加一个“被忽略”的文件。结果发现子文件夹中有另一个 .gitignore 并且覆盖了根文件夹中的那个。

/.gitignore
/some-folder/.gitignore
/some-folder/this-file-keeps-getting-staged

root /.gitignore

忽略了这个-file-keeps-getting-staged

/some-folder/.gitignore

没有指定忽略“this-file-keeps-getting-staged”文件。

因此问题。

其中一件事是简单地在层次结构中搜索多个 .gitignore 文件。并找出适用的规则。

【讨论】:

【参考方案14】:

一个棘手的问题是,如果您执行echo node_modules >> .gitignore 之类的操作,它将无法正常工作。 windows终端将文件保存在UCS-2 LE BOM中,git似乎不接受。

你可以用Notepad打开文件,用UTF-8编码保存

现在可以使用了。

我认为他们需要解决这个问题,因为 echo "filetoignore" >> .gitignore 实际上看起来很方便

【讨论】:

以上是关于git忽略指定的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让git忽略指定的文件

git提交时忽略指定文件

git忽略除指定文件/指定后缀名文件外的文件

git 忽略上传指定文件 命令

idea使用Git提交代码时忽略指定文件或文件夹

git 忽略提交某个指定的文件(不从版本库中删除)