【问题标题】:Git: Where exactly is the "working directory"?Git:“工作目录”到底在哪里?
【发布时间】:2016-03-24 13:27:22
【问题描述】:

我正在阅读一些 Git 教程。 “工作目录”的概念不断被提及,但是,我阅读的教程或文档都没有指出这个“工作目录”在哪里或是什么。 p>

我认为它实际上是 .git 的父目录,也就是我在其中运行 git init 的目录。但我正在观看的视频教程谈到了 nothing to commit 和“工作目录清理”:

事实上,您实际上可以制作存储库的副本,然后制作它 复制使其没有工作目录,这实际上是 称为裸克隆。这实际上是 GitHub 使用的。

如果我对“工作目录”的理解是正确的,存储库怎么可能没有“工作目录”?当它说 GitHub 使用“bare clone”时,这是什么意思?

【问题讨论】:

  • 已覆盖here: "工作目录是项目的一个版本的单个签出。这些文件是从 Git 目录中的压缩数据库中拉出并放在磁盘上的您使用或修改”。
  • 我已经读过了。也许是我的英语,但我就是听不懂。究竟哪个目录是工作目录?
  • 名为.git的目录是你的git目录,.git和所有其他文件所在的目录是工作目录(如果你在本地创建了一个项目,那么你运行命令的目录git init。如果你下载了项目然后单检出项目)。
  • FWIW,“工作目录”术语让我很困惑。如果将它与“暂存区”一起命名为“工作区”,那么我就不那么容易混淆了。

标签: git github working-directory


【解决方案1】:

这有望为我们解决问题:

使用 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 创建的存储库称为裸存储库。他们 与工作目录的结构有些不同。首先, 它们不包含源文件的工作副本或签出副本。和 其次,裸仓库将您的仓库的 git 修订历史存储在根目录中 存储库的文件夹而不是 .git 子文件夹中。注意...裸 存储库通常具有 .git 扩展名。

取自John Saints - What is a bare git repository?

换句话说,一个裸 git clone 不包含检出代码的工作目录。
将其视为 .git 目录(Git 数据库),没有其他任何内容。

【讨论】:

  • 谢谢。我开始明白了。如果 Github 使用的是裸克隆,而裸克隆类似于 .git 目录,为什么 Github 的 repo 中没有 head,index,hook
  • FWIW,“工作目录”术语让我很困惑。如果将它与“暂存区”一起命名为“工作区”,那么它对我来说就不会那么混乱了。
【解决方案2】:

这是您签出项目的任何地方。例如,您签出项目分支的目录。它通常是包含.git 文件夹的文件夹。那是工作目录。当您对签出分支中的文件进行更改时,您将对工作目录进行更改。此时工作目录有未提交的更改。因此,最初,当您没有进行任何提交时,工作目录将是干净的,因为没有任何更改。

【讨论】:

    【解决方案3】:

    工作目录就是您当前正在处理的本地目录。 例如,如果您将 ma​​ster、dev 和 yourname-dev 作为远程分支,如果您 checkoutdevyourname-dev, yourname-dev 现在是你的工作目录,如果你从这个 (yourname-dev) 工作目录结帐到另一个说 devdev 现在是您的新工作目录

    【讨论】:

      【解决方案4】:

      将其他两个答案结合起来:

      Git Documentation:中所述

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

      这实质上意味着,如果您签出一个分支(例如 master)并执行特定的提交(例如 HEAD),那么您的工作目录就是您所有文件和文件夹的“保护伞”术语。

      不是一个特定的目录/文件夹。工作目录涵盖所有目录、文件...一切。
      我提到这一点是因为当您想要提交一些文件时,这些文件将位于工作目录中,您需要在提交它们(使用 git commit)之前暂存它们(使用 git add) .

      【讨论】:

      • 这并不完全正确。当您运行git status 命令时,git 会将特定的“工作目录”与您的索引状态和分支的 HEAD 进行比较。同样,除非您在 git init 期间设置了一些特定的环境变量,否则如果您尝试从 .git 文件夹根目录之外的位置访问 git add,那么您将收到一条错误消息,告诉您需要返回到运行命令的工作目录。因此,虽然我同意存在概念上的“工作目录”,但 Git 实现也会跟踪物理位置。
      【解决方案5】:

      根据documentation

      最后,您有了工作目录。其他两棵树以高效但不方便的方式将其内容存储在 .git 文件夹中。工作目录将它们解压缩到实际文件中,这使您更容易编辑它们。将工作目录想象成一个沙箱,您可以在其中尝试更改,然后再将其提交到暂存区(索引),然后再提交到历史记录。

      【讨论】:

      • 好收获。我想强调这些句子的重要性——“工作目录将它们解压成实际文件,这让你更容易编辑它们”——“把工作目录想象成一个沙箱”
      【解决方案6】:

      回答 OP 的 3 个问题:

      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

      【讨论】:

      • 这是一个完美的答案。或者,几乎完美:有一个指向saintsjd.com/2011/01/what-is-a-bare-git-repository 的链接会很有用,以更好地说明您为什么想要这样一个野兽作为裸存储库。 “在服务器上获取 git”并没有像其他链接那样为我真正做到这一点。
      【解决方案7】:

      您是否直接在本地仓库工作?

      当我按照 Microsoft 的说明进行操作时 [ref. https://docs.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 区域工作)。

      【讨论】:

      • 我将尝试回答我自己的问题:是的,您在本地存储库(itory)中工作。所有本地 git “东西”都放在“本地存储库”a.k.a.“工作文件夹/目录”中的 .git 文件夹中。此处的文件夹/目录是一个可以包含其他文件夹/目录以及文件的文件夹,实际上它总是包含一个 .git 文件夹,否则它就不是存储库。
      猜你喜欢
      • 1970-01-01
      • 2015-05-26
      • 2020-09-28
      • 2016-06-16
      • 2012-03-23
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多