0 评论

0 收藏

分享

[git相关技术] git执行git remote关联了仓库后的.git文件夹目录下到底是些什么东西?优雅草卓伊凡

git执行git remote关联了仓库后的.git文件夹目录下到底是些什么东西?优雅草卓伊凡
当你执行 git init 初始化一个本地仓库,然后使用 git remote add origin <远程仓库URL> 建立与远程仓库的关联后,你的项目目录下的 .git 文件夹里会发生一些变化,但大部分内容在 git init 时就已经创建好了。git remote add 命令主要是在配置文件中添加了远程仓库的地址信息。
下面,我们详细列出并解释 .git 目录下的所有关键文件和文件夹。
.git 目录结构详解
假设你的项目目录是 my-project,那么完整的 Git 仓库就在 my-project/.git/ 下面。
my-project/├── .git/│   ├── HEAD                          # 引用文件,指向当前所在的分支│   ├── config                        # 仓库的配置文件(**remote 信息就在这里**)│   ├── description                   # 仓库的描述信息,仅供 GitWeb 使用│   ├── hooks/                        # 客户端或服务端的钩子脚本目录│   │   ├── pre-commit.sample         # 提交前钩子示例│   │   ├── post-update.sample        # 更新后钩子示例│   │   └── ...                       # 其他示例脚本│   ├── info/                         # 包含一个全局性排除文件│   │   └── exclude                   # 放置不希望被记录在 .gitignore 文件中的忽略模式│   ├── objects/                      # **Git 的核心:数据对象库**│   │   ├── info/                     # 存储额外的对象信息│   │   └── pack/                     # 存储打包后的对象,以节省空间和提高效率│   ├── refs/                         # **存储指向数据(分支、标签、远程分支等)的提交对象的指针**│   │   ├── heads/                    # 存储各个分支的指针(即最新的 commit hash)│   │   ├── tags/                     # 存储各个标签的指针│   │   └── remotes/                  # **存储远程跟踪分支的指针(建立 remote 后出现)**│   │       └── origin/               # **存储名为 origin 的远程仓库的所有分支的指针**│   │           └── HEAD              # 指向 origin 远程仓库的默认分支(通常是 main/master)│   └── index                         # **暂存区(stage)的二进制文件**├── ... (你的项目文件)└── .gitignore                        # 忽略文件列表(不在 .git 目录内,但由 Git 管理)
重点文件和目录的详细说明1. config 文件
这是 git remote add 命令直接修改的文件。它保存了本仓库的所有配置信息。
建立 remote 后,你会在这个文件中看到类似这样的内容:
[core]    repositoryformatversion = 0    filemode = true    bare = false    logallrefupdates = true    ignorecase = true    precomposeunicode = true# ... 其他 core 配置# !!!这就是 `git remote add origin <url>` 添加的内容 !!![remote "origin"]    url = https://github.com/your-username/your-repo.git  # 远程仓库的 URL    fetch = +refs/heads/*:refs/remotes/origin/*          # 抓取映射规则# 当你第一次执行 `git push -u origin main` 后,可能会添加这一行[branch "main"]    remote = origin    merge = refs/heads/main2. objects/ 目录
这是 Git 的数据库、内容寻址文件系统(Content-addressable storage)的核心。所有文件内容、目录结构、提交信息等都存储在这里。
  • 每个对象都有一个唯一的 40 位 SHA-1 哈希值作为文件名。
  • 对象分为四种类型:blob(文件内容)、tree(目录结构)、commit(提交信息)、tag(附注标签)。
  • 最初这个目录几乎是空的,随着你进行 add 和 commit 操作,里面会逐渐生成很多以两个十六进制字符命名的子目录,里面存放着具体的对象文件。
  • pack/ 子目录用于存储“打包”的对象,将多个小对象压缩成一个包文件以节省空间。
3. refs/ 目录
这里存储着“引用”,它们是指向特定提交 SHA-1 值的简单指针。
  • refs/heads/:存储本地分支的指针。例如,refs/heads/main 文件里就保存着 main 分支最新提交的 SHA-1 值。
  • refs/tags/:存储标签的指针。
  • refs/remotes/:在你建立 remote 并执行 git fetch 后,这个目录才变得重要。它存储的是远程跟踪分支,而不是本地分支。
    • refs/remotes/origin/main:这个文件里保存的是你最后一次从 origin 远程仓库抓取时,它的 main 分支所在的提交位置。你不能在这个分支上直接提交代码。

4. HEAD 文件
这是一个特殊的引用文件,它指向当前检出的分支。它的内容通常是:
ref: refs/heads/main
这表示你当前正在 main 分支上工作。当你切换分支时,这个文件的内容会被更新。
5. index 文件
这是 Git 的暂存区(Staging Area) 的二进制表示。当你执行 git add 时,文件的信息(SHA-1、时间戳、文件名等)就会被写入这个索引文件。它充当了工作区和版本库(objects)之间的中间层。
6. hooks/ 目录
这里存放着一些脚本,这些脚本可以在 Git 执行的某些特定时间点(如提交前、提交后、推送前等)被触发运行,用于自动化流程或执行检查。默认都是 .sample 示例文件,去掉后缀即可启用。

总结:建立 Remote 关联后,具体发生了什么?
  • 配置文件更新:.git/config 文件中新增了 [remote "origin"] 段,记录了远程仓库的 URL 和抓取规则。
  • 目录结构准备:.git/refs/remotes/ 目录下会创建 origin/ 子目录,用于之后存放远程跟踪分支的引用。但此时这个目录可能是空的,或者只有一个 HEAD 文件。
  • 数据获取(在你执行 git fetch 后):
    • 当你第一次执行 git fetch origin 或 git pull 时,Git 才会真正与远程仓库通信。
    • 远程仓库的 objects(提交、文件等)会被下载并存入你的本地 .git/objects/ 目录。
    • 远程仓库的分支信息会被记录在 .git/refs/remotes/origin/ 下,例如创建 refs/remotes/origin/main 文件,里面记录了远程 main 分支的最新 commit hash。

所以,简单来说:git remote add 只是“登记”了远程仓库的地址,而 git fetch 才是真正把远程仓库的“内容”和“状态”同步到本地 .git 目录中的操作。 本地的 .git/objects 和 .git/refs/remotes/ 是远程仓库数据在本地的“缓存”和“快照”。

优雅草论坛2022年8月11日大改,优雅草论坛变回只服务于客户的提问交流论坛,详情查看优雅草8月11日大改,原因详情查优雅草外卖乐关闭

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
yac2025
优雅草的临时工
主题 370
回复 0
粉丝 0