点文件:存储在裸 Git 存储库中的最佳方式

免责声明:标题有点夸张,还有其他行之有效的解决方案可以解决这个问题。不过,我确实认为下面的技术非常棒。

最近,我在黑客资讯一篇关于人们存储点文件解决方案的话题中读到了这种神奇的技术。用户 StreakyCobra展示了他优雅的设置和... 非常很有道理!我正在将自己的系统切换到同样的技术。唯一的先决条件是安装 Git

用他的话说,以下技术需要:

无需额外的工具,没有符号链接,在版本控制系统上跟踪文件,您可以为不同的计算机使用不同的分支,可以在新安装时轻松复制配置。

该技术包括使用特别构建的别名,将 Git 裸存储库存储在""文件夹(例如 $HOME/.cfg$HOME/.myconfig 中),这样命令就会针对该存储库运行,而不是针对通常的 .git 本地文件夹,这会干扰周围的任何其他 Git 存储库。

从头开始

如果您之前没有在 Git 存储库中跟踪过您的配置,您可以通过以下几行轻松开始使用这种技术:

1git init --bare $HOME/.cfg
2alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
3config config --local status.showUntrackedFiles no
4echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • 第一行创建了一个文件夹 ~/.cfg,这是一个 Git 裸存储库,用于跟踪我们的文件。

  • 然后我们创建一个别名 config,当我们想与配置存储库交互时,我们将使用它来代替常规 git

  • 我们设置了一个标记(存储库的本地标记)来隐藏我们尚未明确跟踪的文件。这样一来,当您稍后键入 config status 和其他命令时,您不想跟踪的文件不会显示为 untracked

  • 您也可以手动将别名定义添加到 .bashrc 中,或者为方便起见,使用提供的第四行。

我把上面几行打包成了 Bitbucket 上的一个片段,然后从一个短网址进行链接。这样您就可以通过以下方式进行设置:

1curl -Lks http://bit.do/cfg-init | /bin/bash

执行设置后,$HOME 文件夹中的任何文件都可以使用普通命令进行版本控制,将 git 替换为新创建的 config 别名,例如:

1config status
2config add .vimrc
3config commit -m "Add vimrc"
4config add .bashrc
5config commit -m "Add bashrc"
6config push

将您的点文件安装到新系统上(或迁移到此设置)

如果您已经将配置/点文件存储在 Git 存储库中,则可以在新系统上使用以下步骤迁移到此设置:

  • 安装之前,请确保已将别名提交给 .bashrc.zsh

1alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • 而且您的源存储库会忽略您要克隆它的文件夹,这样您就不会造成奇怪的递归问题:

1echo ".cfg" >> .gitignore
  • 现在将您的点文件克隆到存储库中,位于文件夹(您的 $HOME):

1git clone --bare <git-repo-url> $HOME/.cfg
  • 在当前 shell 范围中定义别名:

1alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • 将裸存储库中的实际内容签出到您的 $HOME

1config checkout
  • 上方步骤可能会失败,并显示如下消息:

1error: The following untracked working tree files would be overwritten by checkout:
2    .bashrc
3    .gitignore
4Please move or remove them before you can switch branches.
5Aborting

这是因为您的 $HOME 文件夹可能已经有一些常用的配置文件,这些文件会被 Git 覆盖。解决方案很简单:如果您关心文件,就备份,如果您不关心的话,就删除。我为您提供了一个可能的粗略快捷方式,可以将所有违规文件自动移动到备份文件夹:

1mkdir -p .config-backup && \
2config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
3xargs -I{} mv {} .config-backup/{}
  • 如果您遇到问题,重新运行签出:

1config checkout
  • 在此特定(本地)存储库上将 showUntrackedFiles 标记设置为 no

1config config --local status.showUntrackedFiles no
  • 您已经完成了,现在您可以键入 config 命令来添加和更新您的点文件:

1config status
2config add .vimrc
3config commit -m "Add vimrc"
4config add .bashrc
5config commit -m "Add bashrc"
6config push

同样,作为一种无需在要设置的任何新计算机上记住所有这些步骤的捷径,您可以创建一个简单的脚本,像我一样将其存储为 Bitbucket 片段,为它创建一个简短的网址,然后这样调用它:

1curl -Lks http://bit.do/cfg-install | /bin/bash

为完整起见,这是我最终得到的结果(在许多新创建的 Alpine Linux 容器上测试):

1git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
2function config {
3   /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
4}
5mkdir -p .config-backup
6config checkout
7if [ $? = 0 ]; then
8  echo "Checked out config.";
9  else
10    echo "Backing up pre-existing dot files.";
11    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
12fi;
13config checkout
14config config status.showUntrackedFiles no

总结

我希望您发现这种技术对跟踪您的配置很有用。如果您好奇的话,我的点文件就在这里。另外,请关注我 @durdn 或我优秀的团队 @atlassiandev,与我们保持联系。

为您推荐

Bitbucket 博客

DevOps 学习路径

了解有关 Git 的更多信息

在此中心查找更多 Git 指南和资源。

Morty Proxy This is a proxified and sanitized view of the page, visit original site.