git以及其他的分布式版本控制系统都有一个特点,克隆下的根目录会存在一个.git或者其他的文件,(这个.git里面包含很多信息,后面再谈)而且仅此一处,工作区其他子目录都不存在则没有任何需要追踪的文件或目录,这样的设计比其他集中式的版本控制显的更方便,git也为使用者提供命令搜索工作区文件内容的命令
例如:
git grep "工作区文件内容搜索" ps注意:第一是工作区 第二个是文件内容
因为.git/index记录了工作区文件的状态(实际上是暂存取的状态),
而在非git版本库上执行Git命令会报错fatal: Not a git repository (or any of the parent directories): .git
xxxxxxxxxx
我们用strage命令跟踪执行git status命令的磁盘访问,会发现目录一次向上递归的过程
strace -e "trace=file" git status >> log.txt
...
execve("/usr/bin/git", ["git", "status"], [/* 33 vars */]) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/dev/null", O_RDWR) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
getcwd("/home/jagent/xin/mytest/ddd/cccc"
....
最后能发现结果
xxxxxxxxxx
这需要借助git的一个底层命令来实现
1.显示版本库.git目录所在位置
git rev-parse --git-dir
2.显示工作区根目录
git rev-parse --show-toplevel
3.显示相对于工作区根目录的相对目录
git rev-parse --show-preflx
4.显示从当前目录cd后退up到工作区的根的深度
git rev-parse --show-cdup
xxxxxxxxxx
传统集中式的版本控制将工作区和版本库是相分离的,而git却放在一起
从存储安全的角度来看,确实风险很高的,但git克隆这个机制完全解除这个风险,我们可以通过clone操作在另外多个的磁盘上建立git克隆,当工作区有新的修改,我们才手动或者自动向版本库做push操作如果使用了网络协议,在其他机器上建立clone,这样就更加安全了(多机备份)。如果在开发团队中,那就每个开发者最少一份备份,这样git版本库就更安全了。
xxxxxxxxxx
git有三个配置文件分别是版本库级别的配置文件.git/config,全局配置文件(用户主目录下)~/.gitconfig和系统配置文件(/etc/.gitconfig)
优先级:版本库级别的配置文件>全局配置文件>系统配置文件
全局配置命令;
git config --global user.name
git config --global user.email
删除命令
git config --unset --global user.name
git config --unset --global user.email
查看命令
git config user.name
git config user.email
系统配置命令:
git config --system user.name
git config --system user.email
xxxxxxxxxx
我认为确实不太安全,因为git强调每个人都是版本库的主人,基本上都没有身份认证。根据历史提交
也无法确认开发者,因为用户信息等可以自己设置,如果工作中开发者数量多,这样出现bug无法确认是谁的提交,容易乱扔锅,或者找不到锅。而工作中,我们会采用代码托管工具gerrit,及身份认证
机器上的.gitconfig和gerrit的身份要相同,提交信息也能查到对应提交者
xxxxxxxxxx
主要目的让命令简洁,提升用户体验,满足特殊用户的使用习惯,比如我就喜欢设置别名,有时候工作需要重复输入一些例如git push origin HEAD(--no-thin) git reset --hard等等