Git:如何将外部文件夹(文件)添加到现有存储库中?

时间:2021-04-10 07:11:27

标签: git

我想将外部目录添加到现有存储库。当我在 /Desktop/.git 中尝试以下命令时: git add /home/some/directory

显示以下错误消息:致命:'/home/some/directory' is outside repository

这个问题有什么解决办法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这种事情超出了 Git 的设计。出于以下几个原因,我真的不想将其作为 git: How do you add an external directory to the repository? 的副本关闭:

  • 提出问题的人从未接受任何答案;
  • 拥有该问题的人不再在 StackOverflow 上;和
  • 现有的答案都没有真正解决所有问题。

当我在这里提到“Git 的设计”时,我真正的意思是:Git 存储库是 提交 的集合,其中每个提交都是一些集合的完整快照文件。这组文件都必须存在于(并共存)在 Git 称为工作树工作树中。

除了工作树,还有一个“git dir”。这是 Git 自己的文件(存储存储库内容)所在的位置。默认情况下,Git 目录位于工作树顶层的 .git 中。

因此,如果工作树在您的特定存储库中的 location/Desktop,则 Git 目录为 /Desktop/.git,反之亦然。由于您的 Git 目录是后者,因此您的工作树是前者。这意味着每个提交中存储的每个 file 始终与 /Desktop 相关:一个名为 /dir/sub/file.ext—或 dir/sub/file.ext 的文件;这些在 Git 中是可以互换的,请注意不涉及文件夹或目录,只是正斜杠 - 作为名为 file.ext文件 存储在您的工作树中在 sub 中名为 dir 的文件夹中名为 /Desktop 的文件夹中。

换句话说,Git 获取文件的路径(完整包含嵌入的正斜杠)并将其分解为组件,例如 dirsubfile.ext。如果需要,它将制作文件夹 dir/sub,如果需要,制作文件夹 dir。所有这些都发生在您选择的工作树路径中。最后,一旦必要的文件夹存在,Git 将在您选择的工作树路径中的正确文件夹中创建 file.ext

这一切都基于提交中的内容。提交本身以一种特殊的、只读的、仅限 Git 的格式存储。提交中的每个文件都以仅限 Git 的格式存储——而不是你的计算机格式,它使用文件夹中的文件——其中每个文件都被进一步压缩,为了节省空间,de-在每次提交中重复。这意味着,如果某个大文件在 10,000 次提交中,但在所有一万次提交中相同,那么在 Git 的存储库中实际上只有该文件的一个副本自己的内部压缩和重复数据删除格式。该文件的数据存储在 blob 哈希 ID 名称下,您的计算机无法识别该名称。文件的名称被存储为更多数据,也被压缩和去重!

文件本身后来被解压缩并变成一个普通文件,并给出一个你的计算机操作系统可以理解的名称,并放入你的工作树中;只有这样你才能真正使用你的文件。这是一次提交的一个文件,它将驻留在您的工作树中,与来自该相同提交的每个其他文件共存,也驻留在您的工作树中您的工作树。1


1Git 能够执行 Git 所谓的稀疏检出,其中并非每个文件都被复制到您的工作树中,但这会变得相当复杂。 >


另一个问题中的core.worktree技巧

Git 具有分离 Git 目录和工作树的能力。有多种方法可以做到这一点:

  • git --git-dir=path-to-.git --work-tree=path-to-working-tree command args ...
  • GIT_DIR=path-to.git GIT_WORK_TREE=path-to-working-tree command args ...
  • git config core.worktree path-to-working-tree

等等。

如果您使用这些不同的选项,则必须小心并注意各种警告。例如:

  • --git-dir--work-tree 参数设置环境变量。 (这避免了下一个项目符号中的绊脚石。)
  • 环境变量设置取决于您的 shell:并非每个 shell 都使用此特定语法。请注意,此处的任何 env-var 设置都可能被子进程覆盖;例如,--git-dir--work-tree 参数就是这样做的。
  • 如果您将 Git 目录和工作树分开,请确保 Git 目录不是位于所选的工作树中。如果是,则可以将其视为子模块。
  • 在这些环境变量中运行的命令(包括钩子)可能会在它们不应该(例如,在不同的工作树中工作)或应该(例如,在执行钩子期间)时意外导入或无法导入这些环境变量。这可能会导致这些命令失火。您需要能够诊断这些情况并根据需要进行更正。

总的来说,这可以起作用:您只需要为惊喜做好准备。由于可能会出现意外,我建议始终避免将 Git 目录或工作树设置到您无法从其他副本或备份副本轻松恢复的任何位置。

相关问题