由于没有自动化,我将我的点文件存储在 github 中,非常痛苦。我必须自己更新它。
有没有办法可以自动安装/更新/同步点文件?我的意思是在新服务器中,我下载点文件并执行install
脚本以将点文件复制到本地。一段时间后,我可以执行一个updateToRemote
脚本来将本地更改推送到远程仓库,在另一台服务器上,我可以执行一个updateToLocal
脚本来将远程更改拉到本地。
类似的东西。
有关点文件的主要信息来源是dotfiles.github.io
.
它引用了基于符号链接方法的博客文章,例如Using Git and Github to Manage Your Dotfiles 。
对于初学者,我们将把所有的 dotfiles 放到一个名为 dotfiles 的文件夹中,如下所示
/home/smalleycreative/dotfiles/vimrc
:
然后,我们将简单地从我们的主目录符号链接到它们。
Jaime提到了 Atlassian 教程“存储点文件的最佳方式:裸 Git 存储库”
该技术包括使用特制的别名将 Git 裸存储库存储在“侧”文件夹(如
$HOME/.cfg
或)中,以便针对该存储库而不是通常的本地文件夹运行命令,这会干扰周围的任何其他 Git 存储库。 (然后将 dotfiles 文件夹作为 git repo 进行管理)$HOME/.myconfig
.git/
上面的答案非常好,正是我在“真实操作系统”上的做法。
我在使用 cygwin/msys 的知名商业操作系统上遇到了这个问题,因此使用符号链接有时可能会对我最喜欢的一些软件的“本机”端口产生问题。
为了解决这个问题,我尝试直接将文件夹 $HOME 设为 git 存储库。经过一些失败后,我发现关键都在 .gitignore 文件中。
因此,我已经使用了一段时间的设置是通过将 $HOME 作为存储库、创建 .gitignore 文件并单独添加所需的“dotfiles”文件来创建的。我还在备份驱动器(z:在这种情况下)上添加了一个存储库作为上游,只是为了获得自动备份。如果您的文件夹已经备份,添加上游是不必要的复杂性。因此,假设“/z/Backups/Dotfiles.git”是一个预先存在的“裸”存储库,在 msys shell 中,设置的步骤是:
$ cd $HOME
$ git init
Initialised empty Git repository in $HOME
$ git add .bashrc .emacs .gitconfig # for example
$ git commit -m "Initial import of dotfiles"
[master (root-commit) xxxxxxxx] Initial import for dotfiles
3 files changed, xxx instertions(+)
create mode 100644 .bashrc
create mode 100644 .emacs
create mode 100644 .gitconfig
# The following two lines just add an "upstream" purely for backup purposes.
$ git remote add origin /z/Backups/Dotfiles.git
$ git push -u origin master
<< snip >>
接下来,我将以下内容放入 $HOME/.gitignore:
# First exclude everything.
*
# then re-include all "dotfiles"
!/.*
# then a bunch of specific excludes as they are more-or-less "cache" data rather than configuration.
/.bash_history
/.dbus-keyrings/
/.emacs.d/
/.gimp-2.8/
/.git/
/.gitk
/.idlerc/
/.lesshst
/.saves/
/.thumbnails/
最后,以下命令(抱歉我没有从这些命令中捕获输出)将 .gitignore 本身添加到存储库中:
$ cd $HOME
$ git add .gitignore
$ git commit -m "Added some rules so git status on the dotfiles is useful."
$ git push
现在,您添加到主目录的任何“普通”文件都会被 dotfiles repo 忽略,但任何新的 dotfiles 都会显示在 git status 中,例如:
$ cd $HOME
$ touch NewFile.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
$ touch .funkychicken
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
.funkychicken
nothing added to commit but untracked files present (use "git add" to track)
到目前为止,这一直运行良好,即使某些子目录是他们自己的(不相关的)git 存储库。有时非 git 子目录存在“怪癖”,但到目前为止没有任何问题。
好吧,三年过去了,没有人想出什么好东西,所以我尝试解决这个问题。它是平台不可知论者和 shell 不可知论者,除了您可用的 bourne 兼容 shell(bash、zsh、ksh 等)之外没有依赖关系。它适用于 mac、linux 和 windows:
它将自动与 github 和多台机器同步对您的点文件的更改,以及许多其他功能。
我正在使用 git 存储库 (github) 和 bash 脚本来创建符号链接。但是现在我发现这个工具似乎更强大。看看: https ://github.com/shanx/python-dotfiles 。
我找到了一种有趣的方式来使用普通的 git 来管理你的点文件,不需要符号链接。这样,您应该能够以通常的方式进行推拉:
设置
git init --bare $HOME/.myconf
alias config='/usr/bin/git --git-dir=$HOME/.myconf/ --work-tree=$HOME'
config config status.showUntrackedFiles no
我的 ~/.myconf 目录是一个 git 裸存储库。
用法
然后可以将通常的 git 命令与 git 别名一起使用,例如 config 或您选择的任何内容。
config status
config add .vimrc
config commit -m "Add vimrc"
config push
好处
更多信息
主要思想是拥有一个单独的目录(通常称为 .dotfiles),其中包含您想要在 git 中跟踪的所有真实点文件,并在主目录中具有符号链接。
这种方法已经做了很多工作,所以我建议你检查DFM(dotfiles manager):
我也在寻找一种以最少的步骤设置新机器的方法,在花了一些时间后,我发现几乎所有的开发人员都使用 git 来存储和共享这些文件和符号链接来同步它们。
好吧,符号链接有效,但它不是将本地文件同步到 git 存储库的最佳方式。有一个更好的解决方案,由 Atlassian 的人编写 – https://www.atlassian.com/git/tutorials/dotfiles。
因此,将文件与远程副本同步到 gitbare
存储库是最好和最优雅的方式,创建一个 bash 脚本来自动安装和设置。
管理这些点文件的技巧是创建一个裸 git 存储库。如果您从头开始并且之前没有跟踪您的点文件,请在 $HOME 目录中创建一个裸存储库。
git init --bare $HOME/.dotfiles
为了更容易使用,我们将其命名为 dotfiles,我们将使用它而不是常规 git 来与我们的 dotfiles 存储库进行交互。
alias dotfiles="/usr/bin/git --git-dir=$HOME/.dotfiles --work-tree=$HOME"
现在我们可以使用 dotfiles 命令跟踪我们的 dotfiles,其中一些示例是:
# to check the version history
dotfiles log
# to check the status of the tracked and untracked files
dotfiles status
# to add a file for tracking
dotfiles commit .vimrc -m ".vimrc added"
# push new files or changes to the github
dotfiles push origin main
我也使用这种方式来同步和存储我的 dotfiles,查看我的 dotfiles 存储库,并且可以在Tooling is hard and necessary中阅读我写的关于管理多个设备的 dotfiles 的文章。
对于裸 git 存储库,我建议使用 git 别名而不是 bash 别名。它集成得更好,因为 git 命令的 git 自动完成功能仍然有效:
git init --bare ~/dotfiles.git
git config --global alias.dotfiles '!git --git-dir=$HOME/dotfiles.git/ --work-tree=$HOME'
它是这样使用的:
git dotfiles add .gitconfig
git dotfiles commit -m 'Add gitconfig'
这篇博文中的一些进一步信息。
chezmoi:
太复杂了!
我的软链接变成递归的,原因似乎是 chezmoi
子模块(如软链接。vim-plug 使用子模块来管理插件)
子树(如复制。“互联网上到处都是关于为什么不应该使用 Git 子模块的文章。使用子树!)
https://dotfiles.github.io/tips/
子模块使管理 dotfile 依赖关系变得更加容易。如果您厌倦了子模块,很多人更喜欢 git-subtree,它可以让您将子树(其他存储库)合并到一个 Git 存储库中,然后拆分并将更改推送回。