我正在尝试在目录中提交文件
file1.txt
file2.txt
BigFile1.txt
BigFile2.txt
当我第一次尝试推送时,我意外地跟踪了BigFile1.txt
和BigFile2.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.txt
和BigFile2.txt
(它们在我的目录中有不同的名称,因此我不能使用通配符)并提交并推送到我的遥控器而没有这些复杂情况?< / p>
答案 0 :(得分:0)
您无法使用git rm
删除这些文件,因为它们不在索引中。与此处的部分标题一样,未跟踪的文件非常简单,只是不在索引中的文件。
好的,但那么是什么索引?
Git在您提交新提交时有三件事情可以处理:
您的存储库。这包括你做过的每一次提交(或者从其他任何人那里获取),以及分支名称等跟踪分支提示的内容。所有这些东西都是Git内部格式。
你的工作树。这是你工作的地方,因为它有非Gitty形式的文件,计算机的其余部分可以处理。它也是您保存想要提交的文件的地方。
索引。这个东西有多个角色,但我们关心的那个很简单:它是你构建下一个提交的地方。该索引还有其他几个名称:它也称为临时区域,有时也称为缓存。
索引开始与您当前的提交匹配。也就是说,对于提交中的每个文件,Git将该文件复制到索引,然后从索引复制到工作树。现在你可以开展工作了。
完成后,您git add
该文件。这告诉Git:“将文件从工作树复制到索引中。”这将取代索引中文件的先前版本,因此现在该文件已准备好进入下一次提交。
这几乎就是它的全部内容。当然,您可能会添加一个您不想要的文件,因此您可以git rm
该文件。 从中删除文件索引和工作树。 请注意,这不会触及任何提交!它实际上不能:提交是永久性的,不变的。一旦完成,任何提交都不能永远更改。 (你唯一能做的就是把它扔掉,改成一个新的改进的。)
当然,如果您不想从工作树中删除文件,只需从索引中删除,则需要使用git rm --cached
。但它仍然必须在索引中。未跟踪文件是当前不在索引中的任何文件,因此如果它未被跟踪,git rm --cached
无法将其从索引中删除!
您希望在工作树中保留一些文件,但绝不想添加到索引中。 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问题。