Java ?Git中的实际工作目录是什么?

Java ?Git中的实际工作目录是什么?,java,git,Java,Git,我花了很多时间来弄清楚“Git中的工作目录” 它是一个特殊的文件夹还是目录?或者是目录的一个版本?谁能帮我理解这个概念。 如果我在本地创建一个目录“mydir”,会怎么样 然后我运行:git init。 谢谢在Git中,短语working directory曾经是working tree的同义词。它不再是了,因为短语working directory也可能被您的操作系统使用,通常前面有第三个单词,作为当前工作目录。现代Git试图尽可能多地使用短语working tree,尽管有时会将其缩短为wo

我花了很多时间来弄清楚“Git中的工作目录” 它是一个特殊的文件夹还是目录?或者是目录的一个版本?谁能帮我理解这个概念。 如果我在本地创建一个目录“mydir”,会怎么样 然后我运行:git init。 谢谢

在Git中,短语working directory曾经是working tree的同义词。它不再是了,因为短语working directory也可能被您的操作系统使用,通常前面有第三个单词,作为当前工作目录。现代Git试图尽可能多地使用短语working tree,尽管有时会将其缩短为work tree或worktree,例如在Git worktree add中

在您的操作系统中,当他们使用短语current working directory时,这指的是您当时正在使用的文件夹或目录1。这可能在您的工作树中

在Git中,短语working tree指的是操作系统维护的目录和文件,这些目录和文件保存了文件的副本。这些都是您的,您可以随意处理:Git只需从提交的文件中填充它们

如果我在本地创建一个目录'mydir',然后我[run]:git init会怎么样

让我将其重新表述为以下一系列shell命令:

$ mkdir mydir
$ cd mydir
$ git init
mkdir在当前工作目录中创建一个新的空目录。然后cd进入这个空目录,这样现在原来的./mydir就是您当前的工作目录。git init命令运行时,它自己的当前工作目录就是这个空目录

由于运行git init时目录mydir为空,git将在此mydir目录中创建一个名为.git的隐藏目录/文件夹。此隐藏目录包含正确的存储库。存储库由许多实现多个数据库的文件和目录组成:

一个数据库是使用哈希ID定位内部Git对象的简单数据库。这是构成Git存储库的两个主要数据库中的主要数据库,通常也是最大的数据库

一个数据库是另一个简单的键值存储,它使用名称作为键来存储散列ID,然后在第一个数据库中使用散列ID。这是构成Git存储库的辅助数据库。在当前版本的Git中,这个特定数据库的实现往往有点不可靠:它太依赖于您的操作系统。在macOS和Windows上,它往往有点缺陷。Git中正在进行的工作是用适当的数据库实现来代替它,这将消除这个问题

除了这两个主要数据库之外,存储库还包含许多辅助文件,包括Git的索引(也称为暂存区)。这里最重要的一点是,所有这些实体都位于.git目录中

由于还没有提交,两个主数据库都是空的。在这一点上,Git的索引也是如此

您的工作树由当前工作目录中的所有文件和目录组成,但保存git文件的.git目录除外。由于您的工作树是您的,并且由您的操作系统而不是Git维护,您现在可以在这里创建任何您喜欢的文件

在某个时候,您可能希望Git创建一个新的提交。这将是存储库中的第一次提交。要创建此提交,您将使用GitAdd将要进入此初始提交的文件添加到Git的索引/暂存区域。git add程序通过将工作树文件复制到git的索引中来工作。因此,操作系统的当前工作目录为mydir目录,您现在只需创建一些文件:

$ echo "repository for project X" > README
$ git add README
$ git commit
这里的echo命令在工作树中创建一个名为README的新文件。git add命令获取工作树文件,对其进行压缩和git IFI,使其准备好存储在新的提交中,并将存储的文件写入git的索引。2最后一个命令git commit从提交人那里收集一些元数据,并写出git的索引和此元数据,将结果存储在主数据库中,以创建新的提交

一旦您将这个新的初始提交作为存储库中的第一个提交,分支名称就可以存在了。因为每个分支名称必须持有一个有效的、现有的哈希ID,并且未来提交的哈希ID是不可预测的。3现在有一个提交,这是任何分支名称可以持有的唯一哈希ID。4

随着时间的推移,您将向存储库添加越来越多的提交。一般来说,删除提交是非常罕见的,除了git rebase用新的和改进的提交替换提交的方式。这不是不可能,只是困难。因此,每次新提交都会添加到存储库中

因此,存储库本身包括:

保存提交和其他对象的数据库,以及找到它们的名称; Git的索引,用于保存建议的下一次提交;和 您和/或Git可能需要的其他维护项目 这很有用。 提交对象,实际上是大数据库中的所有对象,都是严格只读的。没有什么,也没有人能改变他们。不过,它们的形式只对Git本身直接有用

克隆存储库包括复制两个数据库,尽管名称数据库仅被部分复制,并且在克隆过程中会发生更改

同时,您的工作树是Git extract提交的地方,它将只对Git直接有用的、只读的内容转换为您可以使用和修改的内容。这些是你的档案。这就是你在工作树中工作的方式。您可以使用结果更新Git的索引,然后使用Git的索引创建新的提交,该提交将添加到存储库中,而不更改存储库中已经存在的任何内容

1在操作系统级别,术语文件夹和目录是同义词。Git本身不存储文件夹或目录:它只存储名称可能包含嵌入斜杠的文件,例如path/to/file.ext。这都是一个文件名。您的操作系统可能会强制您首先创建一个名为path的文件夹,然后在该文件夹中创建一个名为to的文件夹,然后使用path和to文件夹的组合在该路径中创建一个名为file.ext的文件。可以将当前工作目录更改为path,这样您就可以使用名称to/file.ext而不是path/to/file.ext,甚至可以更改为path/to,这样您就可以使用名称file.ext。在所有情况下,Git都将在内部使用名为path/to/file.ext的存储文件。因此,您当前的工作目录是一个操作系统概念,指的是您如何在操作系统维护的文件夹中移动

2从技术上讲,索引实际上并不直接保存文件。相反,它为文件保存一个Git blob对象哈希ID,该ID提供键值对象数据库的密钥,以便Git可以查找文件的内容,加上文件名,其中包含斜杠和一些附加信息。blob对象保存文件内容的压缩和消除重复的副本

这种重复数据消除,以及git add为提交文件做好准备的事实,意味着git commit将运行得非常快,因为它不需要为提交准备任何东西:它只是永久保存已存储在索引中的blob对象

3提交的哈希ID是提交的完整内容的加密校验和。内容不仅包括作为内部Git树对象保存的源文件,还包括确切的日期和时间戳。由于我们甚至不知道您将来会提交什么,更不用说确切的提交时间了,因此我们无法计算未来的哈希ID。你可能知道你将要做什么,这会让你更亲近;但是,除非您确切地知道何时提交它,否则您也不会知道散列ID

4分支名称尤其受到限制:它们只能保存提交哈希ID。标记名称可以保存Git四种内部对象类型中任何一种的哈希ID。通常,标记名要么保存提交散列ID,要么保存新创建的带注释标记对象的散列ID,后者又保存提交散列ID。其他类型的名称可能有自己的限制。

在Git中,短语working directory曾经是工作树的同义词。它不再是了,因为短语working directory也可能被您的操作系统使用,通常前面有第三个单词,作为当前工作目录。现代Git试图尽可能多地使用短语working tree,尽管有时会将其缩短为work tree或worktree,例如在Git worktree add中

在您的操作系统中,当他们使用短语current working directory时,这指的是您当时正在使用的文件夹或目录1。这可能在您的工作树中

在Git中,短语working tree指的是操作系统维护的目录和文件,这些目录和文件保存了文件的副本。这些都是您的,您可以随意处理:Git只需从提交的文件中填充它们

如果我在本地创建一个目录'mydir',然后我[run]:git init会怎么样

让我将其重新表述为以下一系列shell命令:

$ mkdir mydir
$ cd mydir
$ git init
mkdir在当前工作目录中创建一个新的空目录。然后cd进入这个空目录,这样现在原来的./mydir就是您当前的工作目录。git init命令运行时,它自己的当前工作目录就是这个空目录

由于运行git init时目录mydir为空,git将在此mydir目录中创建一个名为.git的隐藏目录/文件夹。此隐藏目录包含正确的存储库。存储库由许多实现多个数据库的文件和目录组成:

一个数据库是使用哈希ID定位内部Git对象的简单数据库。这是构成Git存储库的两个主要数据库中的主要数据库,通常也是最大的数据库

一个数据库就是另一个si 使用名称作为键的MPE键值存储,用于存储哈希ID,然后在第一个数据库中使用。这是构成Git存储库的辅助数据库。在当前版本的Git中,这个特定数据库的实现往往有点不可靠:它太依赖于您的操作系统。在macOS和Windows上,它往往有点缺陷。Git中正在进行的工作是用适当的数据库实现来代替它,这将消除这个问题

除了这两个主要数据库之外,存储库还包含许多辅助文件,包括Git的索引(也称为暂存区)。这里最重要的一点是,所有这些实体都位于.git目录中

由于还没有提交,两个主数据库都是空的。在这一点上,Git的索引也是如此

您的工作树由当前工作目录中的所有文件和目录组成,但保存git文件的.git目录除外。由于您的工作树是您的,并且由您的操作系统而不是Git维护,您现在可以在这里创建任何您喜欢的文件

在某个时候,您可能希望Git创建一个新的提交。这将是存储库中的第一次提交。要创建此提交,您将使用GitAdd将要进入此初始提交的文件添加到Git的索引/暂存区域。git add程序通过将工作树文件复制到git的索引中来工作。因此,操作系统的当前工作目录为mydir目录,您现在只需创建一些文件:

$ echo "repository for project X" > README
$ git add README
$ git commit
这里的echo命令在工作树中创建一个名为README的新文件。git add命令获取工作树文件,对其进行压缩和git IFI,使其准备好存储在新的提交中,并将存储的文件写入git的索引。2最后一个命令git commit从提交人那里收集一些元数据,并写出git的索引和此元数据,将结果存储在主数据库中,以创建新的提交

一旦您将这个新的初始提交作为存储库中的第一个提交,分支名称就可以存在了。因为每个分支名称必须持有一个有效的、现有的哈希ID,并且未来提交的哈希ID是不可预测的。3现在有一个提交,这是任何分支名称可以持有的唯一哈希ID。4

随着时间的推移,您将向存储库添加越来越多的提交。一般来说,删除提交是非常罕见的,除了git rebase用新的和改进的提交替换提交的方式。这不是不可能,只是困难。因此,每次新提交都会添加到存储库中

因此,存储库本身包括:

保存提交和其他对象的数据库,以及找到它们的名称; Git的索引,用于保存建议的下一次提交;和 您和/或Git可能认为有用的其他维护项目。 提交对象,实际上是大数据库中的所有对象,都是严格只读的。没有什么,也没有人能改变他们。不过,它们的形式只对Git本身直接有用

克隆存储库包括复制两个数据库,尽管名称数据库仅被部分复制,并且在克隆过程中会发生更改

同时,您的工作树是Git extract提交的地方,它将只对Git直接有用的、只读的内容转换为您可以使用和修改的内容。这些是你的档案。这就是你在工作树中工作的方式。您可以使用结果更新Git的索引,然后使用Git的索引创建新的提交,该提交将添加到存储库中,而不更改存储库中已经存在的任何内容

1在操作系统级别,术语文件夹和目录是同义词。Git本身不存储文件夹或目录:它只存储名称可能包含嵌入斜杠的文件,例如path/to/file.ext。这都是一个文件名。您的操作系统可能会强制您首先创建一个名为path的文件夹,然后在该文件夹中创建一个名为to的文件夹,然后使用path和to文件夹的组合在该路径中创建一个名为file.ext的文件。可以将当前工作目录更改为path,这样您就可以使用名称to/file.ext而不是path/to/file.ext,甚至可以更改为path/to,这样您就可以使用名称file.ext。在所有情况下,Git都将在内部使用名为path/to/file.ext的存储文件。因此,您当前的工作目录是一个操作系统概念,指的是您如何在操作系统维护的文件夹中移动

2从技术上讲,索引实际上并不直接保存文件。相反,它为文件保存一个Git blob对象哈希ID,该ID提供键值对象数据库的密钥,以便Git可以查找文件的内容,加上文件名,其中包含斜杠和一些附加信息。blob对象保存fil的压缩和消除重复的副本 e的内容

这种重复数据消除,以及git add为提交文件做好准备的事实,意味着git commit将运行得非常快,因为它不需要为提交准备任何东西:它只是永久保存已存储在索引中的blob对象

3提交的哈希ID是提交的完整内容的加密校验和。内容不仅包括作为内部Git树对象保存的源文件,还包括确切的日期和时间戳。由于我们甚至不知道您将来会提交什么,更不用说确切的提交时间了,因此我们无法计算未来的哈希ID。你可能知道你将要做什么,这会让你更亲近;但是,除非您确切地知道何时提交它,否则您也不会知道散列ID


4分支名称尤其受到限制:它们只能保存提交哈希ID。标记名称可以保存Git四种内部对象类型中任何一种的哈希ID。但是,标记名通常保存提交散列ID,或者保存新创建的带注释标记对象的散列ID,而新创建的带注释标记对象又保存提交散列ID。其他类型的名称可能有自己的限制。

这是否回答了您的问题?这回答了你的问题吗?谢谢你的帮助,托瑞克。我现在明白了。谢谢你的帮助。我现在明白了。