点文件:存储在裸 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第一行创建了一个文件夹
~/.cfg,这是一个 Git 裸存储库,用于跟踪我们的文件。然后我们创建一个别名
config,当我们想与配置存储库交互时,我们将使用它来代替常规git。我们设置了一个标记(存储库的本地标记)来隐藏我们尚未明确跟踪的文件。这样一来,当您稍后键入
config status和其他命令时,您不想跟踪的文件不会显示为untracked。您也可以手动将别名定义添加到
.bashrc中,或者为方便起见,使用提供的第四行。
我把上面几行打包成了 Bitbucket 上的一个片段,然后从一个短网址进行链接。这样您就可以通过以下方式进行设置:
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总结
我希望您发现这种技术对跟踪您的配置很有用。如果您好奇的话,我的点文件就在这里。另外,请关注我 @durdn 或我优秀的团队 @atlassiandev,与我们保持联系。