ChatGPT解决这个技术问题 Extra ChatGPT

如何阻止 .gitignore 出现在未跟踪文件列表中?

我刚刚在我的新项目的根目录上做了一个 git init

然后我创建了一个 .gitignore 文件。

现在,当我输入 git status 时,.gitignore 文件出现在未跟踪文件列表中。这是为什么?

git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
我可以忽略 .git/ 文件夹并将其放入“.gitignore”吗?
您可以在 Linux 下的主文件夹中创建一个全局“gitignore”并将其存储在那里: git config --global core.excludesfile ~/.gitignore_global
我是通过搜索 how to gitignore .gitinore file 来到这里的,而问题和接受的答案与标题并没有真正的关系。标题可以改进。
有一些忽略 .gitignore 的用例。我团队的工作流程要求我为本地开发环境更改一组文件,但不应提交它们。可以通过更好的架构改进工作流程,但它不在我的掌控之中。与此同时,让 git 关注这些文件是一种责任。因此,我想对它们进行 gitignore,但仅限于本地,并且我不想冒险提交我的 .gitignore,因为它不应该与团队共享。

A
AdrieanKhisbe

.gitignore 文件应该在您的存储库中,因此确实应该按照 git status 的建议添加并提交它。它必须是存储库树的一部分,以便可以合并对它的更改等等。

因此,将其添加到您的存储库中,它不应该被 gitignored。

如果您确实需要,可以将 .gitignore 添加到 .gitignore 文件中,如果您不想提交它。但是,在这种情况下,最好将忽略添加到 .git/info/exclude,这是一个特殊的签出本地文件,其工作方式与 .gitignore 类似,但不会显示在“git status”中,因为它位于 .git 文件夹中。

另请参阅https://help.github.com/articles/ignoring-files


这不应该是存储库元数据的一部分,而不是被跟踪的文件吗?
存储库元数据是存储库本地的。例如,如果您将提交挂钩添加到您的存储库,并且有人克隆您的存储库,他们将不会获得提交挂钩。
@wukong,如果您在一个团队中工作,每个人不应该忽略同一组文件吗?这就是 .gitignore 文件被添加到存储库的原因。没有人说您必须将其部署为项目的一部分。
@endolith 和 wukong 它不一定是你的仓库中的文件。您可以在许多不同的地方进行忽略设置。 GitHub 上有一篇很棒的文章help.github.com/ignore-files您可以在任何地方进行全局忽略设置,并且可以在 .git 元数据中为 repo 设置 repo 特定设置。
@deed02392 在使用这些忽略文件时,您当然需要对放入其中的内容进行判断,但它们仍然有一些很好的用途。例如,我使用 Vim,因此在我的全局 gitignore 中,我将 *.swp 文件标记为已忽略。这样我就不必将它添加到我的每个项目中,从不使用 vim 的人也不必担心它。
E
Earl Zedd

如果你想在你的 Git 树之外存储被忽略的文件列表,你可以使用 .git/info/exclude 文件。它仅适用于您对 repo 的结帐。


+1,这对于与项目无关的忽略非常有用,例如 emacs *~ 备份文件,来自 OS X 的 .DS_Store 等等。
@AugustLilleaas 我个人更喜欢将这些类型的 {editor,platform} 特定文件放在 ~/.gitignore 中,这样我处理的任何存储库都会忽略它们。
跟踪文件后,您可以使用 git update-index --assume-unchanged <file> 停止跟踪更改而不更改您的存储库。这在您需要进行本地更改的大型共享项目中非常有用,但没有其他人希望看到您的内容提交给 repo。请参阅blog.pagebakers.nl
@AugustLilleaas:Per-user gitignore 更适合该用例。
感谢这个提示,我正在使用 git-svn,所以服务器上 svn repo 的其他用户不会完全希望 .gitignore 签入。
N
Nexaspx

您实际上可以将一行 .gitignore 放入您的 .gitignore 文件中。这将导致 git 忽略 .gitignore 文件。我实际上并不认为这是一个好主意。我认为忽略文件应该进行版本控制和跟踪。我只是为了完整性而把它放在那里。


为我工作!版本 1.5.6.5。我也同意 1800 INFORMATION 这不是一个好主意,但我认为在某些情况下它可能没问题(假设您使用 git-svn 存储库,并且您不希望 git-ish 文件转到 svn)。排除文件可能更好。
@ehsanul - 不得跟踪该文件(您不应该添加或提交它)。您可以取消跟踪它。这在仅 git 的环境中可能不是一个好主意,但如果你碰巧将 git 用作颠覆存储库的智能客户端(其他人都不知道,<疯狂的笑声>) - 这样的技巧很棒。
@IshanSrivastava 您可能已经跟踪了该文件。尝试运行 git rm --cached .gitignore
这个解决方案对我有用,因为我只需要忽略我的回购中的变化。实际提交在子文件夹(项目)内。
P
Pang

您还可以拥有一个全局用户 git .gitignore 文件,该文件将自动应用于您的 all 您的存储库。这对于 IDE 和编辑器文件(例如 Vim 的 swp*~ 文件)很有用。更改目录位置以适合您的操作系统。

添加到您的 ~/.gitconfig 文件中: [core] excludesfile = /home/username/.gitignore 创建一个带有要忽略的文件模式的 ~/.gitignore 文件。将您的点文件保存在另一个存储库中,以便进行备份(可选)。

任何时候你复制、初始化或克隆一个 repo,你的全局 gitignore 文件也将被使用。


我相信这是编辑器留下临时文件的最佳解决方案,例如 .*.swp (VIM) 和 ._* (TM),因为将这些规则连续添加到每个 git 存储库是没有意义的,并强制使用不同 IDE 的其他用户检查这些文件。
这对于不应该被推送到任何分支的忽略非常有效。当然,用您的实际用户名替换“用户名”,如果您已经有一个,请不要在 .gitconfig 中添加第二个 [core] 部分 - 只需将 excludesfile 行放在现有的 [core] 部分下。
L
Leif Gruenwoldt

如果有人已将 .gitignore 添加到您的存储库,但您想对其进行一些更改并忽略这些更改,请执行以下操作:

git update-index --assume-unchanged .gitignore

Source


坏主意,.git/info/excludes 存在是有原因的。
我认为 --assume-unchanged 的存在也是有原因的。为什么一个比另一个好?
如果文件已经被跟踪,顺便说一句 .git/info/excludes 不起作用。
这确实帮助了我一个已经提交但我不希望提交更改的 .gitignore。我正在从 Ubuntu 11.04 存储库运行 git 1.7.4.1,帮助页面将其添加到更新索引中。 “此选项还可用作粗略的文件级机制,以忽略跟踪文件中未提交的更改(类似于 .gitignore 对未跟踪文件所做的操作)。如果需要在索引中修改此文件,Git 将失败(优雅地)例如,在提交合并时;因此,如果假定的未跟踪文件在上游发生更改,您将需要手动处理这种情况。”
我投票赞成这个答案,因为通常你需要这个操作来处理你的主仓库初始状态并保持 git 功能的好处。没有充分的理由忽略此文件(句号)
G
Greg Hewgill

添加 .gitignore 文件并提交后,它将不再显示在“未跟踪文件”列表中。

git add .gitignore
git commit -m "add .gitignore file"
git status

C
Community

以防其他人有与我们一样的痛苦。我们想排除一个已经提交的文件。

这篇文章更有用:working with .git/info/exclude too late

具体来说,您需要忽略文件实际上是使用命令 git remove 参见 git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

你去测试它

git rm --dry-run *.log
(如果您说要排除所有日志文件)

如果您运行它,这将输出将被排除的内容。

然后

你通过去运行它

git rm *.log
(或您想要的任何文件名路径/表达式)

然后将 *.log 行添加到您的 .gitignore 文件中。


当然,您可能希望通过将相关模式(即 *.log)添加到您的 .gitignore 来跟进此操作,这样如果它们将来出现,它们就不会弄乱您的 git status
尽管我的问题与 OP 的问题无关:感谢您让我知道,在对 .gitignore 进行更改后,我需要使用 RM 来“清理”我的存储库(如果文件已经提交)。 Noob 错误,我知道,但这是我个人第一次看到有人提到这一点。
感谢您的反馈。是的,这就是我写它的原因,来到这里然后又走了很长一段路来解决这个问题,我认为写下来会很好。 :)
c
chase

当然 .gitignore 文件会显示在状态中,因为它没有被跟踪,git 认为它是一个好吃的新文件!

但是,由于 .gitignore 是一个未跟踪的文件,因此当您将其放入 .gitignore 时,它会被 git 忽略!

所以,答案很简单:只需添加以下行:

.gitignore # Ignore the hand that feeds!

到您的 .gitignore 文件!

而且,与 August 的回应相反,我应该说 .gitignore 文件不应该在您的存储库中。它只是碰巧可以,这通常很方便。这可能是 .gitignore 被创建为 .git/info/exclude 的替代品的原因,因为它没有被存储库跟踪的选项。无论如何,如何使用 .gitignore 文件完全取决于您。

如需参考,请查看 kernel.org 上的 gitignore(5) manpage


只是一个简单问题所需的简短答案。
c
cellepo

首先,正如许多其他人已经说过的那样,您的 .gitignore 应该由 Git 跟踪(因此不应被忽略)。让我解释一下为什么。

(TL;DR:提交 .gitignore 文件,并使用 global .gitignore 忽略由您的 IDE 或操作系统创建的文件)

正如您可能已经知道的那样,Git 是一个分布式版本控制系统。这意味着它允许您在不同版本之间来回切换(即使开发已经分流到不同的分支),它还允许多个开发人员在同一个项目上工作。

虽然在快照之间切换时跟踪您的 .gitignore 也有好处,但提交它的最重要原因是您希望与从事同一项目的其他开发人员共享该文件。通过将文件提交到 Git 中,其他贡献者在克隆存储库时将自动获取 .gitignore 文件,因此他们不必担心意外提交不应提交的文件(例如日志文件、缓存目录、数据库凭据等)。如果在某个时候项目的 .gitignore 更新,他们可以简单地提取这些更改,而不必手动编辑文件。

当然,会有一些文件和文件夹是您想要忽略的,但它们是特定于您的,不适用于其他开发人员。但是,这些不应该在项目的 .gitignore 中。还有两个地方可以忽略文件和文件夹:

由您的操作系统或 IDE 创建的文件和文件夹应放在全局 .gitignore 中。好处是这个 .gitignore 应用于您计算机上的所有存储库,因此您不必为每个存储库重复此操作。它不会与其他开发人员共享,因为他们可能使用不同的操作系统和/或 IDE。

不属于项目的 .gitignore 或全局 .gitignore 的文件可以使用 your_project_directory/.git/info/exclude 中的显式存储库排除来忽略。此文件不会与其他开发人员共享,并且特定于该单个存储库


全球.gitignore的好消息
我认为在初始设置后 .gitignore 文件应该被忽略,所以没有意外的变化。这并不意味着它不能再改变,但它在某种程度上受到保护,不会发生意外。该文件上的事故可能会引起混乱甚至危及某些工作,因此还应考虑“密封”(忽略自身)。
@Sasa .gitignore 仅适用于忽略 Git 尚未跟踪的文件。将已跟踪的文件添加到 .gitignore 不会阻止您提交对该文件的更改。即使这是可能的,当它指示 Git 忽略自身时,您将如何提交更改的 .gitignore
@Nic - 我已在此线程底部的单独回复中将详细解释传递给我的观点。
A
Abdullah

想法是将特定于您的项目的文件放入 .gitignore 文件中,然后(如前所述)将其添加到存储库中。例如 .pyc.o 文件、测试套件创建的日志、一些固定装置等。

对于您自己的设置创建但不一定会为每个用户显示的文件(如使用 vim 的 .swp 文件、隐藏的 ecplise 目录等),您应该使用 .git/info/exclude(如前所述)。


M
Maze

注意以下“问题” 有时您想添加目录但在这些目录中没有文件。简单的解决方案是创建一个包含以下内容的 .gitignore:

*

这个接缝工作正常,直到您意识到没有添加目录(如预期的那样添加到您的存储库。原因是 .gitignore 也将被忽略,因此目录是空的。因此,您应该做这样的事情:

*
!.gitignore

N
Naskov

这似乎只适用于您当前的目录,以使 Git 忽略存储库中的所有文件。

更新此文件

.git/info/exclude 

用你的通配符或文件名

*pyc *swp *~


C
Community

如果您已经签入 .gitignore 并且想要忽略对它的修改,请查看 this answer

尝试使用以下命令: git update-index --assume-unchanged FILENAME_TO_IGNORE 要反转它(如果您想对其进行更改),请使用: git update-index --no-assume-unchanged 更新:这是列出'的方法假设当前目录下的文件未更改: git ls-files -v | grep -E "^[az]" 因为 -v 选项将使用小写字母表示“假定未更改”文件。


f
felipe.zkn

就我而言,我想排除现有文件。仅修改 .gitignore 不起作用。我按照以下步骤操作:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

通过这种方式,我从缓存中清除了要排除的文件,并将其添加到 .gitignore 中。


对我来说最好的解决方案。你也可以使用 git add 。第二,在那之后 git commit -m "fixing .gitignore"
e
ertemplin

导航到 git repo 的基本目录并执行以下命令:

echo '\\.*' >> .gitignore

所有点文件都将被忽略,包括那个讨厌的 .DS_Store 如果你在 Mac 上。


我不会那样做的。可能有您需要的点文件。相反,我只会逐字添加 .gitignore 和 .DS_Store 。
J
John Brown

最终用户很可能希望 Git 忽略“.gitignore”文件,因为 Eclipse 创建的特定于 IDE 的文件夹可能与 NetBeans 或其他 IDE 不同。因此,为了保持源代码 IDE 的对抗性,可以轻松地拥有一个不与整个团队共享的自定义 git ignore,因为个别开发人员可能使用不同的 IDE。


S
Sergey K.

我发现对讨厌的 .DS_Store 文件设置忽略的最佳位置是在 .git/info/exclude 文件中。

当您在其中设置 git 存储库时,IntelliJ 似乎会自动执行此操作。


用户的全局忽略文件将是忽略 .DS_Store 的更好位置
M
Michael Durrant

.gitignore 是关于忽略 other 文件。 git 是关于文件的,所以这是关于忽略文件的。然而,当 git 处理文件时,这个文件需要作为列出其他文件名的机制存在。

如果它被称为 .the_list_of_ignored_files,它可能会更明显一些。

类比是您不想做的待办事项列表。除非您在某处列出它们,否则您不会知道它们是某种“待办事项”列表。


S
Saša

我认为在某些情况下忽略 .gitignore 非常有用。例如,当您有多个团队或大型团队在同一个代码库上工作时。在这种情况下,您需要有某些约定,其中一个约定是关于 git repo 中忽略的内容。它通常是关于忽略 IDE 或 OS 创建的文件和目录、一些生成的日志等。

但是,有一股力量倾向于对 .gitignore 文件进行非常规的更改。 .gitignore 文件可能会被不负责任的人、错误地、使用的工具或在其他情况下进一步更改。

为了对此产生反作用,我们可以执行以下操作:

最初的 .gitignore 应该反映团队中的约定,在它被推送之后,应该通过添加 .gitignore 条目来保护 .gitignore 并再次推送该更改。 .gitignore 文件以这种方式“密封”。

sealed.gitignore 文件可以在本地进行更改,而无需将该更改程序传播给团队的其他成员。但是,如果更改在整个团队中得到广泛同意,则可以“解封”它,更改它,然后再次“密封”它。这不可能是错误的,只能是故意的。

可悲的是,您不能 100% 免受愚蠢的侵害,但通过这种方式,您已尽一切努力防止愚蠢的事情发生。

如果你的团队相对较小,拥有非常优秀的专业人士,那么这并不重要,但即使是那些人也会很高兴能少担心一件事。

当您无法对基础架构设置做任何事情时,使用 .git/info/exclude 很酷,只需覆盖您自己的 a** 以免出错。

从正确和错误的立场来看,我投票赞成在 .gitignore 文件中包含 .gitignore 条目,让每个人都可以自由地在本地做任何他们想做的事情,但不会侵犯他人。