点文件:存储在裸 Git 存储库中的最佳方式
免责声明:标题有点夸张,还有其他行之有效的解决方案可以解决这个问题。不过,我确实认为下面的技术非常棒。
最近,我在黑客资讯一篇关于人们存储点文件解决方案的话题中读到了这种神奇的技术。用户 StreakyCobra
展示了他优雅的设置和... 非常很有道理!我正在将自己的系统切换到同样的技术。唯一的先决条件是安装 Git。
用他的话说,以下技术需要:
无需额外的工具,没有符号链接,在版本控制系统上跟踪文件,您可以为不同的计算机使用不同的分支,可以在新安装时轻松复制配置。
该技术包括使用特别构建的别名,将 Git 裸存储库存储在"侧"文件夹(例如 $HOME/.cfg
或 $HOME/.myconfig
中),这样命令就会针对该存储库运行,而不是针对通常的 .git
本地文件夹,这会干扰周围的任何其他 Git 存储库。
从头开始
如果您之前没有在 Git 存储库中跟踪过您的配置,您可以通过以下几行轻松开始使用这种技术:
git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
相关资料
如何移动完整的 Git 存储库
查看解决方案
了解 Bitbucket Cloud 的 Git
curl -Lks http://bit.do/cfg-init | /bin/bash
执行设置后,$HOME
文件夹中的任何文件都可以使用普通命令进行版本控制,将 git
替换为新创建的 config
别名,例如:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
将您的点文件安装到新系统上(或迁移到此设置)
如果您已经将配置/点文件存储在 Git 存储库中,则可以在新系统上使用以下步骤迁移到此设置:
- 安装之前,请确保已将别名提交给
.bashrc
或.zsh
:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
- 而且您的源存储库会忽略您要克隆它的文件夹,这样您就不会造成奇怪的递归问题:
echo ".cfg" >> .gitignore
- 现在将您的点文件克隆到裸存储库中,位于点文件夹(您的
$HOME
):
git clone --bare <git-repo-url> $HOME/.cfg
- 在当前 shell 范围中定义别名:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
- 将裸存储库中的实际内容签出到您的
$HOME
:
config checkout
- 上方步骤可能会失败,并显示如下消息:
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting
这是因为您的 $HOME
文件夹可能已经有一些常用的配置文件,这些文件会被 Git 覆盖。解决方案很简单:如果您关心文件,就备份,如果您不关心的话,就删除。我为您提供了一个可能的粗略快捷方式,可以将所有违规文件自动移动到备份文件夹:
mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
- 如果您遇到问题,重新运行签出:
config checkout
- 在此特定(本地)存储库上将
showUntrackedFiles
标记设置为no
:
config config --local status.showUntrackedFiles no
- 您已经完成了,现在您可以键入
config
命令来添加和更新您的点文件:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push
同样,作为一种无需在要设置的任何新计算机上记住所有这些步骤的捷径,您可以创建一个简单的脚本,像我一样将其存储为 Bitbucket 片段,为它创建一个简短的网址,然后这样调用它:
curl -Lks http://bit.do/cfg-install | /bin/bash
为完整起见,这是我最终得到的结果(在许多新创建的 Alpine Linux 容器上测试):
git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if [ $? = 0 ]; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no
分享此文章
下一主题
推荐阅读
将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。