当前位置: 首页 > news >正文

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 = 0filemode = truebare = falselogallrefupdates = trueignorecase = trueprecomposeunicode = true
# ... 其他 core 配置# !!!这就是 `git remote add origin <url>` 添加的内容 !!!
[remote "origin"]url = https://github.com/your-username/your-repo.git  # 远程仓库的 URLfetch = +refs/heads/*:refs/remotes/origin/*          # 抓取映射规则# 当你第一次执行 `git push -u origin main` 后,可能会添加这一行
[branch "main"]remote = originmerge = refs/heads/main
2. objects/ 目录

这是 Git 的数据库、内容寻址文件系统(Content-addressable storage)的核心。所有文件内容、目录结构、提交信息等都存储在这里。

  • 每个对象都有一个唯一的 40 位 SHA-1 哈希值作为文件名。
  • 对象分为四种类型:blob(文件内容)、tree(目录结构)、commit(提交信息)、tag(附注标签)。
  • 最初这个目录几乎是空的,随着你进行 addcommit 操作,里面会逐渐生成很多以两个十六进制字符命名的子目录,里面存放着具体的对象文件。
  • 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 关联后,具体发生了什么?

  1. 配置文件更新.git/config 文件中新增了 [remote "origin"] 段,记录了远程仓库的 URL 和抓取规则。
  2. 目录结构准备.git/refs/remotes/ 目录下会创建 origin/ 子目录,用于之后存放远程跟踪分支的引用。但此时这个目录可能是空的,或者只有一个 HEAD 文件。
  3. 数据获取(在你执行 git fetch 后)
    • 当你第一次执行 git fetch origingit 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/ 是远程仓库数据在本地的“缓存”和“快照”。

http://www.dtcms.com/a/469415.html

相关文章:

  • SpringBoot+Hutool+Vue实现导出
  • 中山建设厅网站首页山东济南网站推广
  • ⸢ 柒-Ⅲ⸥⤳ 可信纵深防御建设方案:数据使用可信端安全可信
  • PHP多维数组按指定字段排序usort自定义排序方法(或使用太空船操作符 <=> 进行比较,默认按升序排序)
  • Ubuntu 20.04 安装 Redis
  • etcd节点噶了导致的k8s集群瘫痪处理参考——筑梦之路
  • stm32底层项目20251011
  • http://localhost:7474/browser/ 登陆之后账号密码neo4j / neo4j 不对 页面出现以下:
  • 网站后台添加不了图片2008r2做网站
  • 学工网站建设博物馆网站建设说明
  • RabbitMQ概述,Rabbitmq是什么
  • C 语言12:字符串函数全解析
  • 国家城乡建设规划部网站邢台专业网站建设价格
  • 三层架构:解耦 JavaWeb 开发的核心范式
  • MySQL————表的约束
  • 速度达24.3MB/s,最新精简可用版!
  • 分业务采用差异化模式:全面提升 SQL Server 系统的并发性能、可靠性与数据准确性
  • 【Linux】应用层自定义协议与序列化
  • 文件上传漏洞: .htaccess文件
  • 【GD32】软件I2C
  • 温州产品推广网站服务网站建设方案
  • 08-docker综合应用
  • 电商网站建设与运营哦在线图片编辑助手
  • 十一款c++小游戏
  • 15-verilog的延时打拍问题记录
  • skynet.newservice接口分析
  • C# 中 Excel 工作表打印前页面边距的设置方法
  • uniapp学习【vue3在uniapp中语法,使用element】
  • 网站建设的基本流程和技术规范懒人免费建站模板
  • Linux的Ext文件系统:硬盘理解和inode及软硬链接