关于 gitignore 文件实现的功能有几种描述:
gitignore - 指定有意忽略的未跟踪文件 - git
有时,有些文件您不希望 Git 检入到 GitHub。有几种方法可以告诉 Git 忽略哪些文件。- github
如果文件未被跟踪并被添加到 gitignore 文件,如果我提交我的存储库,它们将不会被推送到服务器。
如果我在 github 上的存储库中有文件并将它们添加到 .gitignore 中会发生什么。如果人们克隆存储库,他们会收到这些文件吗?
我想提供一个默认凭据文件,该文件应被克隆到人们的存储库中,但如果被所述人更改,则不会被推回。
我想在存储库中提供一个 doc 文件夹,如果克隆该文件夹,则不应将其导入 eclipse。
git 是否能够处理这两种情况,如何正确设置?
tor*_*rek 12
答案是“不”,“也许”,甚至“是的,但可能不是你想的那样”。更具体地说,.gitignore如果有的话,只会间接提供帮助。原因是您只能忽略未跟踪的文件。 还有一种替代方法,即告诉 Git应将跟踪的文件视为未更改。这种替代方法根本不使用.gitignore。(我也不是特别推荐它。
其中许多描述.gitignore含糊不清且难以解释,因为它们没有从正确的基础开始。理解的正确基础.gitignore是 Git 的index,也称为staging area和cache。但在我们开始之前,我们需要一个更基本的项目。
首先请记住,Git 存储的内容——操作单元,可以说是提交。提交包含文件树的单个快照,以及元数据(谁进行了提交以及何时提交;他们对提交的描述;以及一些重要的父提交信息)。人们喜欢将 Git 视为存储文件,这并不是完全错误的,但实际上,Git 存储的是commits,并且是 commits 拥有文件。使用 Git 存储库做某事通常意味着通过提交做某事。请注意,所有现有提交都是只读的:您无法更改任何提交的任何内容。(您可以改为添加新的提交。)
提交或一般 Git 中的文件(包括存储在索引中的文件)以特殊的、压缩的、仅限 Git 的形式存储。这些文件对您计算机上的几乎所有其他内容(包括您自己)都无用,因此 Git 必须将它们提取到工作树中。您可以查看、编辑这些工作树副本,并将其用作凭据等。
当有人克隆存储库时,他们首先获得提交——通常是所有提交。他们还没有索引,也没有工作树。因此,作为 的最后一步git clone,Git 运行git checkout以创建索引和工作树。1 此git checkout步骤选择一个特定的提交,通常是由分支名称命名的提交,例如master. 该提交存储了一个快照——一组文件——并且 Git 现在将这些文件从提交复制到索引中,然后从索引复制到工作树中。
那么,当您第一次克隆存储库或用于git checkout干净地切换到新提交时,您所拥有的是一个索引,其中包含与当前提交中的所有相同文件,以及一个包含所有相同文件的工作树就像索引中一样。索引存在是因为提交是只读的,而工作树存在于索引之外,因为索引以特殊的、仅供内部使用的 Gitty 格式存储文件。
要创建新的提交,您首先要处理工作树中的文件,然后git add在其中的部分或全部文件上运行。什么git add是将文件复制回索引(将它们转换为特殊的 Gitty 格式)。最终,你会运行git commit,而这需要无论是在指数权,然后和用途,为了使快照的新承诺。
1请注意,索引和工作树是成对出现的。如果您git worktree add过去为存储库创建第二个工作树,则会创建一个新索引以配合新工作树。由于历史原因,底层实现有点奇怪,但这些应该始终被视为一种配对。
那么,索引可以被描述为将进入您下一次提交的内容。最初,它包含当前提交中的每个文件,并且它也用于填充工作树。随着时间的推移,您更改存储的数据,甚至可能更改文件集,并从修改后的索引进行新的提交。因此,在任何给定时间,索引中都有一堆文件。一些文件的索引复制与路径P通常将匹配的文件的其他两个副本的至少一个:副本P在当前提交,或副本P在工作树。
正如我们在上面看到的,初始状态是工作树中的每个文件在索引和当前提交中都有一个副本。所有三个副本都匹配。你可以随心所欲地阅读它们,但是如果你在工作树中改变它们,你会遇到一个有趣的情况:Git 现在“想要你”git add它们,将更新的版本复制回索引,以便它们被更新在您进行的下一次提交中。
您可以自己在工作树中创建没有索引条目的新文件。这样的文件称为未跟踪文件。未跟踪文件的定义是任何不在索引中的文件。而且,如果它不在索引中,它也不会在下一次提交中。
请注意,索引中的内容可能会随时间变化。你可以有一个文件,它是在指数现在,然后用git rm或git rm --cached以删除从索引文件。现在它不再在索引中,也不会在下一次提交中。但总的来说,这些也会删除工作树副本。
您可能想要未跟踪的文件。 如果您在工作树中创建了一个没有相应索引和提交条目的文件,则这是一个未跟踪的文件。(因此,一个文件,该文件是在索引和工作树是被跟踪文件。)但是,与未跟踪文件的烦恼:Git的不断抱怨他们。
这是.gitignore文件进来。 一个.gitignore文件列出了具体的路径名称或名称模式。在 Git 抱怨某个文件未被跟踪之前,Git 会检查.gitignore适用于该路径的文件。如果列出了路径,Git 就会直接关闭。 这仅影响未跟踪的文件。 如果文件被跟踪——我们的意思是文件名是否在索引中——那么.gitignore根本不适用。
git update-index --skip-worktree请注意,要忽略文件的前提条件是它也必须未被跟踪。如果它未被跟踪,根据定义,它不会出现在您所做的任何新提交中。为了让它以未跟踪的状态开始,它不能位于您使用git checkout. 所以它可能不是任何有趣的提交。(例如,它可能是在提交历史深处的沉闷、无聊的提交,但是一旦您检查其中一个,该文件就会被跟踪,当您切换回最近的提交时,Git会删除该文件。所以最好完全避免这种情况。)
相反,您可以在索引中有一个文件(因此被跟踪),但告诉 Git,无论工作树版本发生什么,Git 都应该假装什么也没发生,并继续使用索引版本。您可以使用git update-index,使用该--skip-worktree选项来执行此操作。(另请参阅Git - 'assume-unchanged' 和 'skip-worktree' 之间的区别。)
如果文件不在提交中,则在您检出该提交时它不会在索引中。如果您在 的最后一步检出该提交git clone,则您刚刚创建了一个新的索引和工作树对,因此您根本没有任何未跟踪的文件。您想要的凭据文件根本不存在。您必须至少运行一个命令来创建它。(它可以预先列在.gitignore文件中。)
如果该文件是在一个承诺,这将是在索引和工作树,准备使用。但是它不会在索引中被标记为“跳过”,因此如果有人触摸它,Git 会告诉他们提交它。将其添加到.gitignore将无济于事,因为该文件已被跟踪。您必须至少运行一个命令才能跳过它。
无论哪种方式,您都至少需要一个命令超出git clone. 我相信更好的方法是提交模板文件,并让一个命令将这些模板复制到未跟踪的、预先忽略的工作树文件,但该--skip-worktree变体也有效。
| 归档时间: |
|
| 查看次数: |
2519 次 |
| 最近记录: |