使用 Git 本地跟踪文件夹,不跟踪 GitHub 上的文件夹

Bix*_*Bix 5 git version-control github

这似乎是一个显而易见的问题,但我在任何地方都找不到我需要的答案。

我的本地计算机上有一个文件夹。我想用 Git 在本地跟踪它。

当我推送到 GitHub 时,我不想跟踪/推送该文件夹。

这可能吗/我怎样才能做到这一点?

tor*_*rek 3

Tracked,在 Git 中,意味着在索引中1这种方式 只能跟踪文件,不能跟踪文件夹,因为 Git 不存储文件夹。2

\n\n

那么:“索引”到底是什么?好吧,这最终会变得复杂\xe2\x80\x94索引有一堆不同的角色,在合并过程中使用一个复杂的角色\xe2\x80\x94但简单地说,Git中的索引保存着你建议的下一次提交

\n\n

索引一开始保存了某个提交中所有文件的3 个副本。也就是说,您选择一些提交来“签出”,使用或。该提交包含一堆文件。Git 将所有这些文件复制(参见脚注 3)到索引中,然后也复制到您的工作树中。git checkout namegit checkout hash-id

\n\n

工作工作树是您在 Git 中查看使用文件的地方。但工作树中的文件实际上根本不在 Git 中!

\n\n

Git 保留的是提交。每个提交都有自己唯一的哈希 ID。当您进行新的提交或任何人进行任何提交时,Git 会为该提交分配其自己的新的唯一哈希 ID,从那时起,哈希 ID 就意味着提交。这些承诺一旦做出,就永远无法更改。它们要么全有,要么全无:您要么在 Git 中拥有该哈希 ID(在这种情况下您拥有提交),要么根本没有该提交。

\n\n

这使得提交非常适合存档:您或任何人曾经保存的每个文件的每个版本都可供将来检查或永远重复使用!4 不过,为了节省空间和其他充分的原因,它们以特殊的、只读的、仅限 Git 的压缩格式存储。只有 Git 本身可以提取它们,当然,像这样只读,没有人可以更改它们。

\n\n

因此,这意味着提交本身对于完成任何实际工作是没有用的。您必须让 Git将提交提取到某处,以便您可以使用和/或处理它。

\n\n

那个地方就是你的工作树。

\n\n

因为你的工作树是你的,所以你可以将 Git在任何提交中保存的文件粘贴到其中。您选择一些提交并git checkout让 Git 将其所有文件提取到您的工作树中,然后添加一些不在提交中的 其他文件。例如,在您的情况下,您首先创建一个名为的文件夹,然后在该文件夹中创建一个文件。 现在有一些文件:drafts/drafts/

\n\n
    \n
  • 不在当前提交中...
  • \n
  • 所以 Git 没有将其复制到索引中......
  • \n
  • 但它就在那里,drafts/README或者其他什么,在你的工作树中。
  • \n
\n\n

根据定义,即未跟踪的文件

\n\n

如果您告诉 Git 跟踪该文件,通过将其复制到索引中,该文件将出现在您的下一次提交中。 而且,正如code_fodder 所说,共享的是提交。当您将 Git 连接到其他 Git 时git push,您的 Git 会向他们的 Git 发送您拥有的、他们没有的以及您希望他们拥有的部分或全部提交\xe2\x80\x94。您无法在此过程中挑选文件。您要么向他们提供整个提交\xe2\x80\x94 及其所有文件的完整快照\xe2\x80\x94,要么不提供。

\n\n

这意味着你的问题的简短答案就是“不”。 不可能跟踪文件\xe2\x80\x94,这意味着它会进入您所做的每个新提交\xe2\x80\x94,但让您的 Git 将一些您没有做的提交传递给另一个 Git ,这不会\不包含该文件。

\n\n

不过,还有更长的答案。您可以进行保存文件的提交drafts/*可以进行不保存文件的其他提交。然后,您可以小心地仅推送其中从未出现过文件的提交链。drafts/*

\n\n

但是,如果您不小心推送了其中确实出现drafts/*了这些文件的提交之一,则很难收回:Git 将提交视为相当珍贵的(请参阅脚注 4),并且倾向于将所有提交给予每个其他 Git 出现并询问。也就是说,如果您不小心GitHub 发送了提交,而其他人向 GitHub 询问该存储库中的任何新提交,则其他人将获得此提交,现在您必须恳求其他人提供该提交向上。即使你让 GitHub 删除意外提交,另一个人现在也有一份副本。

\n\n

这也是一个相当大的痛苦。如果你有提交a123456...(一些大的丑陋的哈希ID),其中确实drafts/file1.txt,并且提交(b789abc...一些其他不同的大丑陋的哈希ID)其中没有drafts/file1.txt,那么每次你从 切换到 时b789abc...a123456...Git 都会从两者中删除 drafts/file1.txt索引和你的工作树。当从a123456...back切换到 时b789abc...,Git 会将文件从b789abc...back 复制到索引和工作树\xe2\x80\x94 中,因为它必须如此;您的索引保存建议的下一次提交,并且您的工作树应该匹配,至少对于所有跟踪的文件而言。

\n\n

通常,正确的方法是拥有一个单独的 Git 存储库来存储这些内容。也就是说,在里面drafts/,只需创建一个新的Git存储库。外部 Git 保存着所有其他文件,会将所有文件留给drafts/*内部 Git。然后,您可以根本不向任何其他人提供此 Git 存储库。如果您想让某些托管服务器保留副本,您可以单独执行此操作,并且不要让人们访问那里的单独存储库。

\n\n
\n\n

1嗯,这意味着当我们引用文件时。Git 有时也会说一个分支是为了“跟踪”另一个分支而设置的。

\n\n

2发生的情况是,当 Git 遇到一个提交并且该提交包含一个名为 的文件时a/b/c.txt,Git 告诉计算机创建一个名为 的文件a/b/c.txt。为此,如果计算机需要\xe2\x80\x94,显然你的计算机需要\xe2\x80\x94,Git 将创建名为 的文件a,然后创建名为inside 的文件,这样它就可以创建名为inside的文件。但对于 Git 的其余部分来说,这只是一个名为. 它从未保存“文件夹”或“文件夹”,只保存文件bac.txtbaa/b/c.txtab

\n\n

3从技术上讲,索引为每个文件保存对内部 Git blob 对象的引用。但在这个级别上,将索引视为保存每个 Git 格式文件的副本也同样有效。

\n\n

4可以删除提交事实上,这相对容易,直到您自己进行后续提交和/或其他人的提交,制作依赖于该提交的东西(在 Git 中意味着“更多提交”)。然后就变得更难了。所以提交完全只读的\xe2\x80\x94没有人,没有任何东西,甚至Git,可以改变它们\xe2\x80\x94但是如果你做了一个坏的,你可以停止使用它。如果你不使用它,并且已经设置了一些东西,以便你不能再次使用它,并且没有其他人可以使用它,Git 最终会为你清理它。

\n