git 源码学习(init-db) 提交版本号 083c516331
写在前面的废话:
学完git之后,还是感觉云里雾里的,于是乎,就想到了通过学习git源码,来加深git的熟练度,同时学习一下c语言编程。
git源码学习,逐步分析
这篇帖子是逐步分析git源码的,将git的源码按照逻辑块剥离出来,形成一个可执行程序,以便进一步了解git。当然分析的git源码是从git第一次提交开始的。最新的git源码,做为菜鸟的我是不可能看懂的,这辈子都不可能看懂的。接下来进入正题。
1.准备工作
1.1 git clone git源码:
在git命令行中键入如下代码
// 二选一,即可
git clone https://github.com/git/git.git git clone git@github.com:/git/git.git
git源码下载完成之后,切换到第一次提交的源码,步骤如下:
切换到git源码所在的目录下,命令行中键入如下代码
cd /your_local_directory/git git log --reverse // 打印顺序从最早到现在 git reset --hard 083c516331 // git 源码的第一次提交号
如果想要返回最新的版本,可以使用如下命令
git reflog // 查看操作历史记录,其中git clone 前面的commit号就是最新的git源码所在地 git reset --hard <commit> // 执行git log,查看已经是最新的源码了
2.修改Makefile,生成可执行文件
将LIBS=-lssl修改为LIBS=-lcrypto -lz
原版的Makefile不能make成功,愈发之后即可通过。(此处不知原因,有待进一步查明,望哪位大佬指出,谢谢)
如果编译提示找不<openssl/sha.h>,安装libssl-dev即可
如果编译提示找不<zlib.h>,安装zlib即可
完成修改之后,make基本可以成功。
3.分析init-db.c源码
<cache.h>中包含一些标准头文件、宏和自定义的函数
第一个逻辑块是生成一个.dircache文件,相当于git现在的.git文件,剥离出来代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h> #define DB_ENVIRONMENT "SHA1_FILE_DIRECTOY" int main(int argc, char **argv)
{
char *sha1_dir = getenv(DB_ENVIRONMENT), *path;
int len, i, fd; /* https://www.gnu.org/software/libc/manual/html_node/Creating-Directories.html
* mkdir() 是gnu函数,包含在<sys/stat.h>头文件中,详细信息见链接
*/
if (mkdir(".dircache", ) < ) {
perror("unable to create .dircache");
exit();
} return ;
}
第二个逻辑块是获取环境变量,并检查该文件是不是一个directory。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h> #define DB_ENVIRONMENT "SHA1_FILE_DIRECTOY" int main(int argc, char **argv)
{
char *sha1_dir = getenv(DB_ENVIRONMENT), *path;
int len, i, fd; if (mkdir(".dircache", ) < ) {
perror("unable to create .dircache");
exit();
}
/* http://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html
* stat()函数详情
* https://www.gnu.org/software/libc/manual/html_node/Attribute-Meanings.html
* struct stat 结构体详情
*/
sha1_dir = getenv(DB_ENVIRONMENT);
if (sha1_dir) {
struct stat st;
if (!stat(sha1_dir, &st) < && S_ISDIR(st.st_mode))
return ;
fprintf(stderr, "DB_ENVIRONMENT set to bad directory %s: ", sha1_dir);
} return ;
}
第三个逻辑块是在.dircache目录下生成一个objects文件,此文件用来保存sha1值,即commit号。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h> #define DB_ENVIRONMENT "SHA1_FILE_DIRECTOY"
#define DEFAULT_DB_ENVIRONMENT ".dircache/objects" int main(int argc, char **argv)
{
char *sha1_dir = getenv(DB_ENVIRONMENT), *path;
int len, i, fd; /* printf("%s\n", sha1_dir); */ if (mkdir(".dircache", ) < ) {
perror("unable to create .dircache");
exit();
} sha1_dir = getenv(DB_ENVIRONMENT);
if (sha1_dir) {
struct stat st;
if (!stat(sha1_dir, &st) < && S_ISDIR(st.st_mode))
return ;
fprintf(stderr, "DB_ENVIRONMENT set to bad directory %s: ", sha1_dir);
} sha1_dir = DEFAULT_DB_ENVIRONMENT;
fprintf(stderr, "defaulting to private storage area\n");
len = strlen(sha1_dir);
if (mkdir(sha1_dir, ) < ) {
if (errno != EEXIST) {
perror(sha1_dir);
exit();
}
} return ;
}
最后一个逻辑块是在objects目录下生成256个文件,文件名称是从00-ff。这些文件用来保存sha1值,即commit号,比如commit号为083c516331,会保存在08目录中内容为3c516331
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h> #define DB_ENVIRONMENT "SHA1_FILE_DIRECTOY"
#define DEFAULT_DB_ENVIRONMENT ".dircache/objects" int main(int argc, char **argv)
{
char *sha1_dir = getenv(DB_ENVIRONMENT), *path;
int len, i, fd; if (mkdir(".dircache", ) < ) {
perror("unable to create .dircache");
exit();
} sha1_dir = getenv(DB_ENVIRONMENT);
if (sha1_dir) {
struct stat st;
if (!stat(sha1_dir, &st) < && S_ISDIR(st.st_mode))
return ;
fprintf(stderr, "DB_ENVIRONMENT set to bad directory %s: ", sha1_dir);
} sha1_dir = DEFAULT_DB_ENVIRONMENT;
fprintf(stderr, "defaulting to private storage area\n");
len = strlen(sha1_dir);
if (mkdir(sha1_dir, ) < ) {
if (errno != EEXIST) {
perror(sha1_dir);
exit();
}
} path = malloc(len + );
memcpy(path, sha1_dir, len);
for (i = ; i < ; i++) {
sprintf(path+len, "/%02x", i);
if (mkdir(path, ) < ) {
if (errno != EEXIST) {
perror(path);
exit();
}
}
}
free(path); return ;
}
至此init-db.c分析完毕,谢谢阅读,如有不足之处,欢迎指出邮箱BruceContact@163.com
git 源码学习(init-db) 提交版本号 083c516331的更多相关文章
- 源码学习之ASP.NET MVC Application Using Entity Framework
源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...
- 05.ElementUI源码学习:项目发布配置(github pages&npm package)
0x00.前言 书接上文.项目第一个组件已经封装好,说明文档也已编写好.下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages功能实现.同时将组件发布之 npm 上,方便 ...
- Seata Server 1.5.2 源码学习
Seata 包括 Server端和Client端.Seata中有三种角色:TC.TM.RM,其中,Server端就是TC,TM和RM属Client端.Client端的源码学习上一篇已讲过,详见 < ...
- Redis源码学习:字符串
Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...
- 框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)
一.Spring事务管理的特点 Spring框架为事务管理提供一套统一的抽象,带来的好处有:1. 跨不同事务API的统一的编程模型,无论你使用的是jdbc.jta.jpa.hibernate.2. 支 ...
- RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...
- Vue.js 源码学习笔记
最近饶有兴致的又把最新版 Vue.js 的源码学习了一下,觉得真心不错,个人觉得 Vue.js 的代码非常之优雅而且精辟,作者本身可能无 (bu) 意 (xie) 提及这些.那么,就让我来吧:) 程序 ...
- Spring5.0源码学习系列之浅谈懒加载机制原理
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...
随机推荐
- Oracle官网登录下载资源账号密码共享
Oracle帐号:2696671285@qq.com Oracle密码:Oracle123 可爱博主:AlanLee 博客地址:http://www.cnblogs.com/AlanLee 本文出自博 ...
- 风险管理,未雨绸缪——《代码之殇》读书笔记II
这次的内容主要是关于软件开发过程中的风险管理,包括项目用时估计.产品的发布与更新.承诺兑现的重要性. ①项目用时估计 有人会质疑项目用时估计的可靠性,因为就事而言,这次的任务可能和上次不一样了,开发环 ...
- LeetCode 题解之Add Binary
1.题目描述 2.题目分析 使用string 的逆向指针,做二进制加法,注意进位问题就可以. 3.代码 string addBinary(string a, string b) { string::r ...
- ubuntu 下mysql导入出.sql文件
1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导 ...
- PLSQL中使用二维存储结构---二维数组
代码如下: --PLSQL中没有数组的概念 用TYPE 和Table of Record来代替多维数组--create by jenrry 20171028-- 1.0 建立存放列的测试表creat ...
- python基础_类型_dict
#dict字典,其实与其叫字典不如叫key-value更合适,不知道这个名是怎么来的,这个可以用来搞用户名和密码,不过搞这个不用数据库是不是显得太low了 #用花括号{}扩起来,逗号分隔每个元素,每个 ...
- git 代码上传至远程仓库&从远程库克隆到本地
1.下载安装Git.下载:https://git-scm.com/downloads 安装:可参考文章http://blog.csdn.net/zzfenglin/article/details/5 ...
- PSR规范学习笔记
PSR已经经历了5次变革,如今PSR4就是最新的标准,但是还是有必要了解下5个版本的内容的,于是去php-fig网站看了下英文原版: 大概看了遍,发现这规范很多的必须很多时候只是建议,但是PHP解析器 ...
- October 1st 2017 Week 40th Sunday
It's only after we've lost everything that we're free to do anything. 只有我们失去了所有之后我们才能随心而为. After los ...
- Shell定时删除日志
vim del_log.sh #!/bin/bash location="/home/dl/code/logs" find $location -mtime +4 -type f ...