是否可以将分离和修改的文件夹重新连接到 Git 存储库



>我有一个源代码文件夹,该文件夹被错误地复制了文件,而不包含任何内部.git目录,随后进行了修改。 运行 git 状态显示"致命:不是 git 存储库...">

是否可以将此复制的目录(及其内容)重新连接回源 Git 存储库或该存储库中的新分支? (并使用 git diff、提交/推送任何值得保留的内容等检查是否有任何源代码更改) 如果是这样,如何?

TL;DR:只需将文件放置到位并对其运行git add即可。


首先,让我们把一些事情弄清楚,否则它们会引起混乱。

文件夹是操作系统级别的概念:文件夹包含子文件夹和/或文件。 Git 不存储文件夹。 Git 存储提交,并提交存储文件(仅 - 不是文件夹)。

Git 以特殊的、压缩的、只读的、仅 Git 的格式存储文件。 这些文件具有全名,例如a/b/c.ext. 它们不存在于文件夹中,它们只是以您的操作系统可能坚持需要分解文件夹的方式命名。 这些存储的文件都无法更改! 它们一直被冻结。 这对于存档非常有用 - 例如,用于查看文件的旧版本 - 但对于完成任何工作完全无用。 另外,当然,这些冻结文件是仅限 Git 的格式。 计算机上的其余程序根本无法使用它们。 冻结的文件深埋在您的操作系统坚持 Git 必须使用的.git目录/文件夹中;在这里,他们有奇怪的名字,比如11ccea40716d9bbcef731f093e530a9b1aee0013. 它们甚至可能根本没有明显的名称(当"打包"时),但在这种情况下,使用11ccea40716d9bbcef731f093e530a9b1aee0013作为键的数据库仍然可以访问它们。

为了让你使用、更改和存储你的文件的新版本,Git必须为你提供一个单独的工作区。 Git 将此工作区(Git 允许您查看和处理文件的地方)称为工作树或工作树,或此名称上任意数量的类似变体。

Git 实际上并没有使用此工作树中的文件!它们只是从某些提交中提取的。 提交包含 Git 应该使用的名称,例如Makefilebuiltin/rebase.c,以及 Git 可以检索文件数据的内部奇怪名称。 Git 将提取文件,并在操作系统要求 Git 这样做时创建任何文件夹。 例如,为了使文件具有类似builtin/rebase.c的名称,操作系统要求 Git 首先创建一个builtin文件夹(如果它尚不存在),因此 Git 将这样做。

如果您以任何方式更改了其中一个文件,则必须告诉 Git:将Makefilebuiltin/rebase.c的工作树版本复制回临时存储区域,您将从中进行新提交。你用git add来做到这一点.

git addpath告诉 Git:嗨! 如果您有具有此名称的文件的现有副本,准备进入下一次提交,请将其替换为工作树中的版本。 如果没有,请将文件的副本放入我们要构建下一次提交的存储区域中。您在其中组装新提交的存储区域被称为索引暂存区域缓存(目前很少)。

您可以随时在工作树中包含不在索引中的文件。 位于工作树中但不在索引中的文件称为未跟踪文件。 通常通过打印文件夹名称而不是所有单独的文件名来汇总整个文件夹,但实际上,该文件夹中的文件(使用它们的全名,而不是操作系统要求的切片文件夹化名称)不在索引中,因此不会出现在下一次提交中。

您可以使用简单的git addfolder添加整个文件夹 - 充满文件。 Git 将通读文件夹以查找其所有文件,从中组合全名,并将每个全名git add索引,从而创建文件的永久冻结副本。 (但请参阅下面的.gitignore说明。 然后,您的最终下一个git commit将进行新的永久冻结提交。 新的提交将成为您当前的提交,将包含您运行git commit时索引中的每个文件,其形式与此时在索引中的形式相同

事实上,Git 使用每个文件的索引副本(而不是工作树副本)是您在更改文件时必须不断重新git add文件的原因。 (有一些快捷方式,如git add -ugit commit -a,它让 Git 扫描您的整个工作树以查找自索引副本以来更改的文件,并自动更新它们,但这仍然意味着先更新索引,然后提交)

若要获取索引中所有文件的列表(请注意,此列表可能很长,并且几乎没有任何用处),可以运行git ls-files。 但与其这样做,通常最好运行git status.git status命令将:

首先,列出
  • 您所在分支的名称,有时还要列出更多信息。

  • 然后,对于索引中的每个文件,将该文件的内容与当前(永久冻结)提交中的对应文件进行比较。 对于匹配的文件,什么都不说。 对于不匹配的文件,假设此文件已暂存以进行提交。 如果有 10,000 个文件,但其中只有 2 个不匹配,你会得到一个很好的简短列表,告诉你如果你现在提交,快照有两个文件与快照不匹配。

    对于当前提交中而不是索引中的文件,请调用它们暂存以删除。

  • 单独:对于索引和/或工作树中的每个文件,将准备冻结的索引副本与工作树副本进行比较。 如果两者匹配,什么都不说。 如果它们不匹配,请说些什么:说此文件未暂存以进行提交

    如果索引中有文件,但不在工作树中,git status会将它们标记为"已删除"。

    如果有文件在工作树中,但不在索引中...嗯,这就是.gitignore的用武之地。git status命令通常会抱怨这些文件,说它们未被跟踪。 毕竟,这是未跟踪文件的定义:它是一个在工作树中但不在索引中的文件。

但是,对于许多软件开发来说,拥有数千个未跟踪的文件是完全正常的。 我们需要一种方法来让 Git 停止抱怨他们。 列出这些文件,或名称模式,如*.o*.pyc__pycache__/,告诉Git:对这些未跟踪的文件闭嘴。 它还具有告诉 Git 的重要且有用的副作用:如果我对整个文件夹(满载文件)进行批量添加,如果它们尚未在索引中,请不要将它们添加到索引中。这意味着您通常只需git add .添加所有内容:如果需要,已经跟踪的文件会更新,并且任何未被特别忽略的新文件都会被跟踪。

您只需将整个文件夹(满载文件)移动(或复制)到工作树中即可。 这些文件当前不在索引中,因此它们都将被取消跟踪。 您只需git add它们即可将当前版本放入索引中。 它们不会有以前的版本 - 现有提交无法更改,因为它们会一直被冻结 - 但它们将出现在您进行的下一次提交中,并从那时起继续存在于每次提交中,直到您从索引中显式删除它们。

在您的情况下,如果您的文件夹充满新文件有一些不应跟踪的文件,您可能需要使用git status查看哪些文件现在被列为未跟踪。 如果其中一些应该保持未跟踪状态,您可以在.gitignore文件中列出它们。然后,您可以执行git addfolder操作。 如果git status通过显示来总结它们:

Untracked files:
...
folder/

您可以运行git status -uall以使 Git 显示所有文件名,而不是将它们汇总到文件夹名称中。

最新更新