工作流 dotfile 配置文件同步最佳方案
unix 环境下,家目录配置如何同步? 比如,我有一些 alias 命令,是我日常的使用习惯,如果我需要在多台设备上使用,我需要复制过来复制过去? 又例如像 zsh 这种程序自定义配置,我希望可以在不同的设备上同步,而不是所有设备去单独配置一份。这篇文章,记录如何利用 Git 去同步配置。
Pre-Learning
Bare repositoires(裸仓库) 是什么?
我们可以通过 git init --bare
是创建一个裸仓库(bare repository), 和我们日常的 git init
不同,裸仓库 没有工作目录。 一般来说,裸仓库是一个共享仓库,是 push
,pull
操作的对象仓库。但是,我们永远不会直接 commit
到这个仓库,因为它没有工作目录, 也就意味着我们不能在该仓库中直接修改文件。可以将 --bare
视为将仓库标记为存储设施的一种方式,而不是开发环境。这意味着在几乎所有的 Git 工作流中,中央仓库是裸仓库,而开发者的本地仓库是非裸仓库。
中央(共享)仓库通常以裸仓库创建,避免使用普通仓库的原因是向一个非空仓库推送分支容易覆盖掉已有的修改。
为什么需要裸仓库
如果向一个有工作目录的仓库推送代码,可能会导致冲突和混乱,因为推送的更改可能与工作目录中的文件不一致。裸仓库避免了这个问题,因为它没有工作目录。
简单来说,裸仓库就是专门用来接收推送和提供拉取的"纯净"Git 仓库。
GitHub、GitLab 等平台上的仓库本质上都是裸仓库
普通仓库git init (开发环境) |
裸仓库git init --bare (存储设施) |
---|---|
就像一个"工作台" | 就像一个"仓库"或"图书馆" |
包含 .git 目录(Git 数据)且有实际的文件可以编辑 |
只包含 Git 数据,没有工作目录 |
用于日常开发工作 | 专门用来存储和管理代码历史 |
包含工作目录(实际的文件) | 不能直接编辑文件,不用于直接开发工作 |
可以直接编辑文件、提交更改 | 主要用于作为远程仓库,供其他人推送和拉取 |
主要用途
- 作为中央仓库:在团队开发中作为共享的远程仓库
- 服务器端仓库:部署在服务器上,供多个开发者协作
- 备份仓库:用于备份代码
示例
# 创建裸仓库 git init --bare my-project.git # 其他开发者可以克隆这个裸仓库 git clone /path/to/my-project.git # 或者推送到这个裸仓库 git remote add origin /path/to/my-project.git git push origin main
copy success