gitignore会阻止git拉文件吗?

时间:2018-01-28 22:28:13

标签: git github

gitignore文件有多种描述:

  

gitignore - 指定要忽略的故意未跟踪文件 - git

     

有些文件您不希望Git签入GitHub。有几种方法可以告诉Git要忽略哪些文件。 - github

如果文件未被跟踪并被添加到gitignore文件,则如果我提交我的存储库,它们将不会被推送到服务器。

如果我在github上的存储库中有文件并且它们被添加到.gitignore中会发生什么。如果他们克隆存储库,人们会收到这些文件吗?

  1. 我想提供一个默认凭证文件,该文件应克隆到人员存储库中,但如果被所述人员更改则不会被推回。

  2. 我想在存储库中提供一个doc文件夹,如果克隆的话,不应该导入到eclipse中。

  3. git是否能够处理这两种情况,以及如何正确设置?

1 个答案:

答案 0 :(得分:3)

答案是" no"或"也许",甚至"是的,但可能不是你想的方式"。更具体地说,.gitignore只会间接帮助,如果有的话。原因是你只能忽略未跟踪文件。还有一种方法,就是告诉Git应该将跟踪文件视为未更改。此替代方案根本不使用.gitignore。 (我也不特别推荐它。

有关.gitignore的许多描述含糊不清且难以解释,因为它们并非始于正确的基础。理解.gitignore的正确基础是Git的索引,它也称为临时区域缓存。但在我们开始之前,我们需要一个更基本的项目。

基础:提交,索引和工作树

首先请记住,Git存储的操作单元是 commit 。提交包含文件树的单个快照,以及元数据(谁进行提交以及何时;提交的描述;以及一些关键的提交信息)。人们喜欢将Git视为存储文件,并且这并非完全错误,但实际上,Git正在存储提交,而且它是具有文件的提交。使用Git存储库执行某些操作通常意味着使用提交执行某些操作。请注意,所有现有提交都是只读的:您无法更改任何提交的任何内容。 (您可以改为添加 new 提交。)

提交中的文件或Git中的文件 - 包括存储在索引中的文件 - 以特殊的,压缩的,仅Git形式存储。这些文件几乎对您计算机上的其他所有文件(包括您自己)都无用,因此Git必须将它们提取到工作树中。它是您可以查看,编辑,用作凭据等工作树副本。

当有人克隆存储库时,他们首先会获得提交 - 通常是所有。他们还没有索引,他们还没有工作树。因此,作为git clone的最后一步,Git运行git checkout创建索引和工作树。 1 这个{{1} } step选择一个特定提交,通常是由分支名称git checkout命名的提交。该提交存储了一个快照 - 一组文件 - 而Git现在将这些文件从提交复制到索引中,然后从索引复制到工作树中。

当您第一次克隆存储库或使用master干净地切换到新提交时,您拥有的是一个索引,其中包含当前提交中所有相同的文件,以及一个工作-tree充满了索引中的所有相同文件。索引存在是因为提交是只读的,并且工作树与索引分开存在,因为索引以特殊的,仅限内部的Gitty格式存储文件。

要创建新提交,首先要处理工作树中的文件,然后对部分或全部文件运行git checkoutgit add做的是将文件复制回索引(将它们转换为特殊的Gitty格式)。最终你将运行git add,然后使用索引中的任何内容,并使用它来为新提交创建快照。

1 请注意,索引和工作树是成对的。如果使用git commit为存储库创建第二个工作树,则会创建一个新索引以与新工作树一起使用。由于历史原因,底层实现有点奇怪,但这些应始终被视为一种配对。

定义索引

然后,索引可以被描述为将进入下一次提交的内容。最初,它还包含当前提交中的每个文件,并且它也用于填充工作树。随着时间的推移,您可以更改存储的数据,甚至可以更改文件集,并从修改后的索引中进行新的提交。因此,在任何给定时间,索引都包含大量文件。具有路径 P 的某个文件的索引副本通常会匹配文件的其他两个副本中的至少一个:当前提交中的 P 的副本,或者副本 P 在工作树中。

如上所述,初始状态是工作树中的每个文件在索引和当前提交中都有一个副本。这三个副本都匹配。你可以随心所欲地阅读它们,但是如果你在工作树中更改它们,你会遇到一个有趣的情况: Git now"想要你"到git worktree add他们,将更新的版本复制回索引,以便在下次提交时更新它们。

工作树文件跟踪未跟踪

您可以自己在工作树中创建没有索引条目的文件。这样的文件称为未跟踪文件。未跟踪文件的定义是不在索引中的任何文件。并且,如果它不在索引中,它也不会在下一次提交中。

请注意,索引中的内容可能会随时间而变化。您现在可以拥有索引中的文件,然后使用git addgit rm 从索引中删除文件。现在它不再在索引中,并且不会在下一次提交中。但一般来说,这些也会删除工作树副本。

您可能需要未跟踪的文件。如果您在工作树中创建了一个没有相应索引和提交条目的文件,那么这是一个未跟踪文件。 (因此索引和工作树中 的文件是跟踪文件。)但是对未跟踪的文件感到烦恼:Git一直抱怨他们

这是git rm --cached文件的来源。 .gitignore文件列出了特定的路径名​​称或名称模式。在Git抱怨文件未被跟踪之前,Git会检查适用于该路径的.gitignore个文件。如果列出了路径,Git就会关闭。 这仅影响未跟踪的文件。 如果跟踪文件 - 我们的意思是文件的名称是否在索引中 - 那么.gitignore会根本不适用。

替代方案是.gitignore

请注意,要忽略的文件的前提条件是它也必须未跟踪。如果它未被跟踪,根据定义,它不是您所做的任何新提交。要使开始为未跟踪,它必须不在您使用git update-index --skip-worktree签出的提交的索引中。所以它可能不在任何有趣的提交中。 (例如,它可能在提交历史的深层,无聊的提交中,但是一旦你检查其中一个,就会跟踪文件,当你切换回最近的提交时,Git 删除< / em>该文件。因此,最好完全避免这种情况。)

相反,你可以在索引中有一个文件(因此被跟踪),但告诉Git无论工作树版本发生了什么,Git应假装没有发生任何事情,并继续使用索引版本。您可以使用git checkout选项使用git update-index执行此操作。 (另见Git - Difference Between 'assume-unchanged' and 'skip-worktree'。)

审核,或者,没有好的答案

如果文件不在提交中,则在您签出该提交时它不会在索引中。如果您将该提交检出为--skip-worktree的最后一步,那么您只需创建一个索引和工作树对,这样您就不会有任何未跟踪的文件所有。您想要的凭据文件只是不存在。您必须至少运行一个命令才能创建它。 (它可以预先列在git clone文件中。)

如果提交中的文件 ,它将在索引和工作树中,随时可以使用。但它赢了被标记为&#34;跳过&#34;在索引中,如果有人触摸它,Git会告诉他们提交它。将其添加到.gitignore会有所帮助,因为该文件已被跟踪。您必须至少运行一个命令才能跳过它。

无论哪种方式,您至少需要一个.gitignore之外的命令。我认为更好的方法是提交已提交的模板文件,并让一个命令将这些模板复制到未跟踪,预先忽略的工作树文件,但git clone变体也有效。