gitignore不会忽视自己,也不会发现自己

时间:2017-02-19 22:54:12

标签: git

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

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

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

/BigFile1.txt
/BigFile2.txt

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

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

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

当我尝试使用.gitignore删除git rm --cached时,我

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

我如何忽略BigFile1.txtBigFile2.txt(它们在我的目录中有不同的名称,因此我不能使用通配符)并提交并推送到我的遥控器而没有这些复杂情况?< / p>

1 个答案:

答案 0 :(得分:0)

未跟踪文件是指不在索引

中的文件

您无法使用git rm删除这些文件,因为它们不在索引中。与此处的部分标题一样,未跟踪的文件非常简单,只是不在索引中的文件。

好的,但那么是什么索引?

Git在您提交新提交时有三件事情可以处理:

  • 您的存储库。这包括你做过的每一次提交(或者从其他任何人那里获取),以及分支名称等跟踪分支提示的内容。所有这些东西都是Git内部格式。

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

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

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

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

这几乎就是它的全部内容。当然,您可能会添加一个您不想要的文件,因此您可以git rm该文件。 中删除文件索引工作树。 请注意,这不会触及任何提交!它实际上不能:提交是永久性的,不变的。一旦完成,任何提交都不能永远更改。 (你唯一能做的就是把它扔掉,改成一个新的改进的。)

当然,如果您不想从工作树中删除文件,只需从索引中删除,则需要使用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-they-both”。但是,这个名字有点太长了,因此.gitignore

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

您添加了文件并提交了

你提到了:

  

当我第一次尝试推送时,我意外地跟踪了BigFile1.txt和BigFile2.txt ......

这表示您git add - 编辑了,然后git commit - 编辑了结果索引。这意味着这些文件现在在提交中。即使您现在git rm --cached大文件,也只是将它们从索引中取出。你必须“把它们拿出来” - 而你和Git实际上并不能这样做。您需要做的是复制提交到没有大文件的新的改进版本。或者,如果提交添加大文件,则完全提交。有关如何执行此操作,请参阅之前任意数量的StackOverflow问题。