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 */]) = 0access("/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) = 3access("/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) = 3access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)open("/usr/local/lib/libz.so.1", O_RDONLY|O_CLOEXEC) = 3access("/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) = 3access("/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) = 3access("/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) = 3open("/dev/null", O_RDWR) = 3open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3getcwd("/home/jagent/xin/mytest/ddd/cccc"....最后能发现结果
xxxxxxxxxx这需要借助git的一个底层命令来实现1.显示版本库.git目录所在位置git rev-parse --git-dir2.显示工作区根目录git rev-parse --show-toplevel3.显示相对于工作区根目录的相对目录git rev-parse --show-preflx4.显示从当前目录cd后退up到工作区的根的深度git rev-parse --show-cdup
xxxxxxxxxx传统集中式的版本控制将工作区和版本库是相分离的,而git却放在一起从存储安全的角度来看,确实风险很高的,但git克隆这个机制完全解除这个风险,我们可以通过clone操作在另外多个的磁盘上建立git克隆,当工作区有新的修改,我们才手动或者自动向版本库做push操作如果使用了网络协议,在其他机器上建立clone,这样就更加安全了(多机备份)。如果在开发团队中,那就每个开发者最少一份备份,这样git版本库就更安全了。
xxxxxxxxxxgit有三个配置文件分别是版本库级别的配置文件.git/config,全局配置文件(用户主目录下)~/.gitconfig和系统配置文件(/etc/.gitconfig)优先级:版本库级别的配置文件>全局配置文件>系统配置文件全局配置命令;git config --global user.namegit config --global user.email删除命令git config --unset --global user.namegit config --unset --global user.email查看命令git config user.namegit config user.email系统配置命令:git config --system user.namegit config --system user.email
xxxxxxxxxx我认为确实不太安全,因为git强调每个人都是版本库的主人,基本上都没有身份认证。根据历史提交也无法确认开发者,因为用户信息等可以自己设置,如果工作中开发者数量多,这样出现bug无法确认是谁的提交,容易乱扔锅,或者找不到锅。而工作中,我们会采用代码托管工具gerrit,及身份认证机器上的.gitconfig和gerrit的身份要相同,提交信息也能查到对应提交者
xxxxxxxxxx主要目的让命令简洁,提升用户体验,满足特殊用户的使用习惯,比如我就喜欢设置别名,有时候工作需要重复输入一些例如git push origin HEAD(--no-thin) git reset --hard等等