Git初始化之思考为什么工作区根目录下有一个.git目录

Git的一个显著特点是,版本库位于工作区的根目录下。对于Git来说,版本库位于工作区根目录下的 .git 目录中,且仅此一处,在工作区的子目录下则没有任何其他跟踪文件或目录。

Git这种将版本库放在工作区根目录下的设计使得所有的版本控制操作(除了与其他远程版本库之间的互操作)都在本地即可完成,不像Subversion只有寥寥无几的几个命令脱离网络执行。而且,Git没有CVS和Subversion中存在的安全泄漏问题(只要保护好 .git 目录)。

Git将版本库(.git目录)放在工作区根目录下,那么Git的相关操作一定要在工作区根目录下执行吗?换句话说,当工作区中包含子目录,并在子目录中执行Git命令时,如何定位版本库呢?实际上,当在Git工作区的某个子目录下执行操作的时候,会在工作区目录中依次向上递归查找 .git 目录,找到的 .git 目录就是工作区对应的版本库, .git所在的目录就是工作区的根目录,文件.git/index记录了工作区文件的状态(实际上是暂存区的状态)。

另外,如果在非Git工作区执行 git 命令时会因为找不到 .git 目录而报错。

$ cd /path/to/my/workspace/
$ git status
fatal: Not a git repository (or any of the parent directories): .git

如果在工作区的某个深层的子目录中,我们有什么办法知道Git版本库的位置呢?如何才能知道工作区的根目录在哪里呢?可以用Git的一个底层命令来实现,具体操作过程如下例:

1. 在工作区中建立目录a/b/c,进入到该目录中。

$ cd /path/to/my/workspace/demo/
$ mkdir -p a/b/c
$ cd /path/to/my/workspace/demo/a/b/c

2. 显示版本库 .git 目录所在的位置:

$ git rev-parse --git-dir
/path/to/my/workspace/demo/.git

3. 显示工作区根目录:

$ git rev-parse --show-toplevel
/path/to/my/workspace/demo

4. 相对于工作区根目录的相对目录:

$ git rev-parse --show-prefix
a/b/c

5. 显示从当前目录(cd)后退(up)到工作区的根的深度:

$ git rev-parse --show-cdup
../../../

传统的集中式版本控制系统的工作区和版本库都是相分离的,像Git这样把版本库目录放在工作区是不是太不安全?

从存储安全的角度上来讲,将版本库放在工作区目录下有点“把鸡蛋装在一个篮子里”的味道。如果忘记了工作区中还有版本库,当直接从工作区的根执行目录删除操作时就会连版本库一并删除,这个风险的确很高。将版本库和工作区折开似乎更加安全,但是不要忘记了之前的讨论,如果将版本库和工作区拆开,就要引入其他机制以便实现版本库对工作区的追踪。

Git克隆可以降低因为版本库和工作区混杂在一起而导致的版本库被破坏的风险。可以通过克隆操作在本机另外的磁盘/目录中建立Git克隆,并在工作区有新的提交时,手动或自动地执行向克隆版本库的推送(git push)操作。如果使用网络协议,还可以实现在其他机器上建立克隆,这样就更安全了(双机备份)。对于使用Git做版本控制的团队,每个人都是一个备份,因此团队开发中的Git版本库更安全,管理员甚至无须顾虑版本库存储的安全问题。

时间: 2024-11-05 16:26:25

Git初始化之思考为什么工作区根目录下有一个.git目录的相关文章

Git初始化之思考git config命令的各参数有何区别

在之前出现的git config 命令中,有的使用 --global 参数,有的使用了 --system 参数,这两个参数有什么区别吗?执行下面的一系列命令后,你就会明白使用不同参数的 git config 命令实际操作的文件了. 执行下面的命令,将打开 /path/to/my/workspace/demo/.git/config 文件进行编辑. $ cd /path/to/my/workspace/demo/ $ git config -e 执行下面的命令,将打开 /home/fuhd/.gi

Git初始化之思考是谁完成的提交

前面一开始先为Git设置了全局配置变量 user.name 和 user.email,如果不设置会有什么结果呢?执行下面的命令,删除Git全局配置文件中关于user.name和user.email的设置: $ git config --unset --global user.name $ git config --unset --global user.email 这样一来,关于用户姓名和邮件的设置都被清空了,执行下面的命令将看不到输出: $ git config user.name $ git

Git初始化之思考命令别名是干什么的

前面,我们通过对 alias.ci 等Git配置变量的设置为Git设置了命令别名.命令别名可以帮助用户解决从其他版本控制系统迁移到Git后的使用习惯问题.CVS和Subversion等在提交的时候,一般习惯使用 ci (check in)子命令,在检出的时候则习惯使用 co (check out)子命令.如果Git不能提供对 ci 和 co 这类简洁命令的支持,对于拥有其他版本控制系统使用经验的用户来说,Git的用户体检就会打折扣.幸好聪明的Git提供了别名机制,可以满足用户特殊的使用习惯. 前

Git初始化及仓库创建和操作

步骤一:创建git初始化工作空间,在对应的工作空间,打开git命令行模式 步骤二:1).设置用户名:git  config -- global  user.name  'github上注册的用户名';   2).设置用户邮箱:git config --global user.email '注册时候邮箱 3).校验是否成功 git config --list; 步骤四:初始化git仓库,创建成功后,到对应文件夹下查看即可 步骤五:    a). cd gitDemo   b).git init -

ubuntu新增加固态硬盘,格式化并挂载到根目录下

前言:将固态硬盘装到电脑,ubuntu系统需要格式化并挂载才能正式使用 将固态装在电脑上后,打开后端 1:查看现有硬盘分区及挂载状态 命令 :df -h 没有新增的SSD固态硬盘 2:查看服务器所有安装的硬盘状态(包括已安装和未安装的) 命令: fdisk -l 此时已经安装的磁盘,但是没有分区,先分区 3, 将磁盘分区,分一个区挂载到根目录下 命令:fdisk /dev/sdb  (该目录是上面未安装的磁盘目录) 输入完命令后按回车或者直接按回车就好了 4 在查看磁盘分区情况 命令:fdisk

Git 初始化版本库

创建带工作区的版本库 在开始一个新项目时,首先就要创建并初始化代码库.如果是在本机的工作目录中,那么: $ git init 也就够用了.如果想要初始化的版本库不在当前目录,需要为 git init 命令指定版本库所在的目录: $ git init hello 执行完命令,在当前目录或您指定的目录下会创建一个名为 .git 的目录,这就是版本库了. 带工作区的版本库主要用于日常工作.其工作模式为:先把代码提交到本地的版本库中,然后通过本地库推送到服务器上的版本库中. 创建裸版本库 相对于带工作区

使用git初始化本地仓库并提交到远程分支

创建本地文件并提交到github远程分支,步骤如下: 1.通过github创建repository,本例中repository名称为maven_demo,工程为maven + spring + mybatis集成小demo,有兴趣的童鞋可以瞅瞅,github地址为https://github.com/smileLuckBoy/maven_demo.git 2.在项目根目录下添加文件.gitignore,内容为无需添加版本控制的文件列表,具体语法大家自行百度即可哦,示例如下: *.classpat

git 初始化安装以及git常用命令

新建一个站点文件夹: myweb; 安装git 完成后,设置账号,在命令行输入: git config --global user.name "php7" git config --global user.email "[email protected]" 执行命令初始化:git init;  将myweb文件夹变成git管理的目录. //现在开始拉取项目代码: git clone https://github.com/php7/phpdev.git 这样就把项目代

linux根目录下各文件夹的作用

linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件 /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序 /tmp 公用的临时文件存储点 /root 系统管理员的主目录(呵呵,特