【问题标题】:gitignore not ignoring itself nor finding itselfgitignore 不会忽略自己也不会发现自己
【发布时间】:2017-07-09 02:28:59
【问题描述】:

我正在尝试提交目录中的文件

file1.txt
file2.txt
BigFile1.txt
BigFile2.txt

当我第一次尝试推送时,我不小心跟踪了 BigFile1.txtBigFile2.txt,但是当我看到它们太大时,我使用 git rm --cached 阻止了它们被 git 跟踪。我做了一个.gitignore 文件

/BigFile1.txt
/BigFile2.txt

但是当我现在尝试提交时,我收到以下错误

user:directory username$ git commit -m "asdf"
On branch master
Untracked files:
    .gitignore
    .gitignore~

没有添加到提交但存在未跟踪的文件

当我尝试用git rm --cached 删除.gitignore 时,我得到了

user:directory username$ git rm --cached .gitignore~
fatal: pathspec '.gitignore~' did not match any files

我如何忽略 BigFile1.txtBigFile2.txt(它们在我的目录中具有不同的名称,因此我不能使用通配符)并提交并推送到我的遥控器而不会出现这些并发症?

【问题讨论】:

    标签: git


    【解决方案1】:

    未跟踪的文件是不在索引中的文件

    您无法使用git rm 删除这些文件,因为它们不在索引中。就像这里的章节标题一样,未跟踪的文件很简单,就是不在索引中的文件。

    好的,但是到底是什么索引?

    在您进行新提交时,Git 有三样东西可供您使用:

    • 您的存储库。这包含您曾经做出的每一次提交(或从其他任何人那里获得的),以及诸如分支名称之类的内容以跟踪分支提示。所有这些东西都是 Git 专用的内部格式。

    • 您的工作树。这是您工作的地方,因为它具有计算机其余部分可以处理的非 Gitty 形式的文件。它也是您保存不想想要提交的文件的地方。

    • 索引。这个东西有多个角色,但我们在这里关心的很简单:它是您构建下一次提交的地方。该索引还有其他几个名称:它也称为暂存区,有时也称为缓存

    索引开始匹配您当前的提交。也就是说,对于提交中的每个文件,Git 将该文件复制到索引,1,然后从索引复制到工作树。现在你可以开始工作了。

    一旦你完成了它,你git add 文件。这告诉 Git:“将文件从工作树复制到索引中。”这将替换索引中文件的先前版本,因此现在该文件已准备好进入下一次提交。

    这就是它的全部内容。当然,你可能会添加一个你不想要的文件,所以你可以git rm这个文件。 删除文件——从both索引工作树。 请注意,这不会涉及任何提交!实际上不能:提交是永久且不变的。一旦完成,任何提交都不能永远改变。 (你唯一能做的就是把它完全扔掉,换一个新的和改进的。)

    当然,如果您不想从工作树中删除文件,而只是从索引中删除,则需要使用git rm --cached。但它仍然必须在索引中。未跟踪文件是指当前不在索引中的任何文件,因此如果未跟踪,git rm --cached 无法将其从索引中删除!

    gitignore 的作用:实际上并不是“忽略”

    总有一些文件你想保留在你的工作树中,但永远不想添加到你的索引中。 Git 一直在抱怨:“嘿,我在这里找到了这个工作树文件,它不在你的索引中!也许你应该添加它!”我们需要让 Git 对这些文件闭嘴,这是 .gitignore 所做的大部分工作。

    您还可以使用git add .git add -a 或类似名称将文件整体添加到Git;在这种情况下,我们要确保 Git 不会自动添加这些文件。这就是.gitignore 的大部分其他功能。

    所以.gitignore 真的是“.git-shut-up-about-these-untracked-files-and-do-not-auto-add-them-either”。不过,这个名字有点太长了,因此是.gitignore

    您通常确实想要提交.gitignore 文件。如果是这样,git add.gitignore 文件(将其复制到索引中),最终,git commit 结果(使索引成为新的提交)。但是,如果您希望这个关闭 Git 的东西永久存储在提交中,您可能应该告诉 Git 在 .gitignore 之外关闭这些文件(例如,使用 @ 987654337@:存储库目录中不属于任何提交的文件)。

    您添加了文件并提交了它们

    你提到:

    我第一次尝试推送时不小心跟踪到 BigFile1.txt 和 BigFile2.txt...

    这表明您git add-ed 他们然后也git commit-ed 结果索引。这意味着这些文件现在在提交中。即使您现在git rm --cached 本身就是大文件,也只会将它们从索引中删除。你必须将它们从提交中“取出”——而你和 Git 实际上无法做到这一点。您需要做的是复制 提交到没有大文件的新改进版本。或者,如果该提交 only 添加了大文件,则完全放弃该提交。有关如何做到这一点,请参阅之前的任何 StackOverflow 问题。


    1从技术上讲,索引包含对内部 Git blob 对象引用。这些内部 blob 对象是只读的:通过创建一个新的 blob 对象,然后引用它来将一个全新版本的文件复制到索引中。通过发现已经有一个有效的 blob 对象保存文件内容并引用它来将现有版本复制回索引中。这真正归结为将文件复制到索引中是“免费的”,因为它不会占用您无论如何都不会占用的任何磁盘空间。您仍然可以将其视为索引中的私有副本,即使它实际上只是对 Git 已经拥有或将来需要的副本的引用。

    【讨论】:

    • 这让我对 Git 有了更多的了解,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多