Git:工作目录到底在哪里?

43

我正在学习Git教程,其中一直提到"工作目录"的概念,但是没有一个教程或文档能够指出这个"工作目录"的位置或是具体含义。

我曾经认为它实际上是.git的父级目录,也就是我运行git init命令的目录。但是我正在观看的视频教程谈论的是"没有要提交的内容"和"工作目录干净"的状态:

事实上,你可以制作一个仓库的副本,并使该副本不具有工作目录,这实际上被称为裸克隆。这就是GitHub使用的方式。

如果我的"工作目录"理解是正确的,那么仓库怎么可能没有"工作目录"?当它说GitHub使用"裸克隆"时,这意味着什么?


5
这里有详细的说明(https://git-scm.com/book/zh/v2/Git-基础-起步-关于版本控制):“工作目录是项目某个版本的单一检出。这些文件从 Git 目录中的压缩数据库中提取出来,放在磁盘上供你使用或修改。” - Maroun
1
我已经读过了,也许是我的英语不好,但我就是没懂。究竟哪个目录是工作目录? - shenkwen
3
名为.git的目录是你的git目录,而所有其他文件都驻留在其中的工作目录中(如果你在本地创建了一个项目,则是运行git init命令的目录。如果你下载了项目,则是该项目的单个检出)。 - haccks
1
就我个人而言,“工作目录”这个术语真的让我感到困惑。如果它被命名为“工作区”,并与“暂存区”一起使用,那么对我来说就不会那么令人困惑了。 - Elijah Lynn
7个回答

20

希望这可以为我们澄清一些事情:

使用git init命令创建的存储库与使用git init --bare命令创建的存储库有什么区别?

使用git init命令创建的存储库称为工作目录。在存储库的顶层文件夹中,您将找到两个内容:

A .git subfolder with all the git related revision history of your repo
A working tree, or checked out copies of your project files.

通过使用 git init --bare 创建的仓库称为 bare 仓库。它们与工作目录结构略有不同。首先,它们不包含源文件的工作副本或已检出副本。其次,bare 仓库将您的仓库的 git 版本历史存储在仓库的根文件夹中,而不是在 .git 子文件夹中。请注意,惯常的做法是给裸仓库添加 .git 扩展名。

摘自 John Saints - 什么是 bare git 仓库?

换句话说,bare git 克隆不包含已检出代码的工作目录。
可以将其视为只有 .git 目录(Git 数据库),没有其他内容。


1
谢谢。我开始理解了。如果Github使用裸克隆,而裸克隆就像.git目录,为什么Github的存储库中没有headindexhook呢? - shenkwen
就我个人而言,“工作目录”这个术语真的让我感到困惑。如果它被命名为“工作区”,并与“暂存区”一起使用,那么对我来说就不会那么令人困惑了。 - Elijah Lynn

14

它指的是您检出项目的位置。例如,您检出项目分支的目录。通常,它是包含.git文件夹的文件夹。那就是工作目录。当您更改已检出分支中的文件时,您会更改工作目录。此时,工作目录有未提交的更改。因此,最初,在您没有进行任何提交时,工作目录将是干净的,因为没有更改。


8

综合前两个答案:

正如在Git文档中所述:

工作目录是项目一个版本的单个检出。

这意味着如果你检出一个分支(例如master)并处于特定的提交(例如HEAD),你的工作目录是所有文件和文件夹的“大伞”术语。

它并不是特定的目录/文件夹。工作目录涵盖所有目录、文件...一切。
我提到这一点是因为当你想要提交一些文件时,这些文件将在工作目录中,你需要使用git add将它们进行“暂存”,然后再使用git commit进行提交。


1
这并不是严格正确的。当你运行 git status 命令时,Git 会将一个特定的“工作目录”与你的索引和分支头部的状态进行比较。同样地,除非你在 git init 过程中设置了一些特定的环境变量,否则如果你尝试从 .git 文件夹根目录之外的位置进行 git add 操作,那么你将会收到一个错误提示,告诉你需要返回到工作目录才能运行该命令。因此,虽然我同意存在一个概念上的“工作目录”,但 Git 的实现也跟踪着一个物理位置。 - user2858650

8
工作目录就是你当前正在操作的本地目录。
例如,如果你有 master、devyourname-dev 三个远程分支,并且你从 dev 分支 checkoutyourname-dev 分支,那么此时 yourname-dev 就成为了你的工作目录。如果你从这个(yourname-dev)工作目录切换到另一个分支,比如 dev,则dev 就成为了你的新的工作目录。

4
根据文档
最后,您有了工作目录。另外两个树以高效但不方便的方式存储它们的内容,即在 .git 文件夹内。工作目录将它们解压为实际文件,这使得您更容易编辑它们。把工作目录看作沙盒,在其中您可以尝试更改,然后将其提交到您的暂存区(索引)和历史记录中之前。

不错。我想强调这些句子的重要性:
  • “工作目录将它们解压为实际文件,这使您更容易编辑它们。”
  • “把工作目录看作沙盒。”
- Remo Harsono

2

回答OP的三个问题:

Q1: "工作目录" 究竟在哪里?
A1: "一个Git项目通常由一个带有位于顶层的 '.git' 子目录的工作目录组成。"(来源:https://git-scm.com/docs/git#_discussion

Q2: 一个仓库如何没有 "工作目录"?
A2: Git 的 "裸仓库" 就是一个例子(来源:https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server#_getting_git_on_a_server

Q3: 当GitHub使用 "裸克隆" 时,这意味着什么?
A3: 在此处阅读关于 git clone 命令的 --bare 选项的文档:https://www.git-scm.com/docs/git-clone


1
这是一个完美的答案。或者,几乎完美:如果有一个链接到 https://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/ 的话会更好,可以更好地表明为什么想要一个像裸库这样的东西。“在服务器上使用git”并没有像其他链接那样让我真正理解它的用途。 - fool4jesus

0

你直接在本地仓库中工作吗?

当我按照微软的说明 [参考 https://learn.microsoft.com/en-us/azure/devops/repos/git/clone?view=azure-devops&tabs=visual-studio] 进行操作时,我最终打开了 .sln 解决方案文件。这对我来说似乎是错误的和不幸的,因为我更喜欢在我的大容量 D 盘 (D:\dev) 上工作,而不是在默认情况下保存仓库的 C:\Users\\source\repos 中工作(我不介意将本地仓库保存在那里 - 虽然不理想 - 只要我能在我的 D:\dev 区域工作即可)。


我将尝试回答自己的问题:是的,您在本地仓库中工作。所有本地的git“东西”都放置在您的“本地仓库”或“工作文件夹/目录”中的.git文件夹中。这里的文件夹/目录是一个可以包含其他文件夹/目录的文件夹,确实它总是包含一个.git文件夹,否则它就不会成为一个仓库。 - Zeek2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接